2014-12-17 3 views
1

chromecast에서 다국어 오디오 트랙을 재생하려고합니다. 비디오/오디오 파일을 재생하지만 영어에서 스페인어로 전환하지 않습니다. Silverlight 플레이어에서 같은 파일을 사용하여 전환 할 수 있습니다. 내 chromecast 플레이어 언어와 안드로이드 전화 언어를 스페인어로 설정했습니다. Google Cast SDK 개발자 콘솔에서 대체 트랙으로 스페인어를 추가했습니다.Chromecast 다 언어 재생 언어가 감지되지 않습니다.

Google 가이드에 지정된 코드를 사용하여 맞춤식 플레이어를 추가했지만 가이드의 코드가 곧게 복사하여 붙여 넣기되지 않습니다. 누군가가 나를 protocol.getStreamCount()가 0 인 이유를 지시 할 수 있습니까? 통화 시간이 맞습니까? 다음은 전체 플레이어입니다. window.changeLanguage = function() ... 및 changeLanguage 호출에 특히주의하십시오. 어떤 도움이라도 대단히 감사합니다!

<html> 
<head> 
    <title>Test Player</title> 
    <script type="text/javascript" src="//www.gstatic.com/cast/sdk/libs/receiver/2.0.0/cast_receiver.js"></script> 
    <script type="text/javascript" src="//www.gstatic.com/cast/sdk/libs/mediaplayer/1.0.0/media_player.js"></script> 
    <link rel="stylesheet" type="text/css" href="chromecast.css" /> 
</head> 
<body> 
<video id='vid' /> 


<script type="text/javascript"> 
if (window.location.href.indexOf('Debug=true') != -1) { 
    cast.receiver.logger.setLevelValue(cast.receiver.LoggerLevel.DEBUG); 
    cast.player.api.setLoggerLevel(cast.player.api.LoggerLevel.DEBUG); 
} 

var mediaElement = document.getElementById('vid'); 
var protocol = null; 
// Create the media manager. This will handle all media messages by default. 
window.mediaManager = new cast.receiver.MediaManager(mediaElement); 
window.defaultOnLoad = mediaManager.onLoad; 
mediaManager.onLoad = function (event) { 
    if (window.player !== null) { 
    player.unload(); // Must unload before starting again. 
    window.player = null; 
    } 
    if (event.data['media'] && event.data['media']['contentId']) { 
    console.log('Starting media application'); 
    var url = event.data['media']['contentId']; 
    window.host = new cast.player.api.Host({'mediaElement':mediaElement, 'url':url}); 
    var ext = url.substring(url.lastIndexOf('.'), url.length); 
    var initStart = event.data['media']['currentTime'] || 0; 
    var autoplay = event.data['autoplay'] || true; 
    mediaElement.autoplay = autoplay; // Make sure autoplay get's set 

    if (url.lastIndexOf('.m3u8') >= 0) 
    { 
     // HTTP Live Streaming 
     protocol = cast.player.api.CreateHlsStreamingProtocol(host); 
    } 
    else if (url.lastIndexOf('.mpd') >= 0) 
    { 
     // MPEG-DASH 
     protocol = cast.player.api.CreateDashStreamingProtocol(host); 
    } 
    else if (url.indexOf('.ism/') >= 0) 
    { 
     // Smooth Streaming 
     protocol = cast.player.api.CreateSmoothStreamingProtocol(host); 
    } 
    // How to override a method in Host. I know that it's safe to just provide this 
    // method. 
    host.onError = function(errorCode) { 
     console.log("Fatal Error - " + errorCode); 
     if (window.player) { 
     window.player.unload(); 
     window.player = null; 
     } 
    }; 
    console.log("we have protocol " + ext); 
    if (protocol !== null) { 
     console.log("Starting Media Player Library"); 
     window.player = new cast.player.api.Player(host); 
     window.player.load(protocol, initStart); 
     changeLanguage(); 
    } 
    else { 
     window.defaultOnLoad(event); // do the default process 
    } 
    } 
} 

window.changeLanguage = function() { 
var currentLanguage = null; 
var streamCount = protocol.getStreamCount(); 
console.log("streamCount: " + streamCount); 
var streamInfo; 
for (var i = 0; i < streamCount; i++) { 
    console.log("isStreamEnabled " + i + "? " + protocol.isStreamEnabled(i)); 
    if (protocol.isStreamEnabled(i)) { 
    streamInfo = protocol.getStreamInfo(i); 
    console.log("streamInfo isAudio? " + streamInfo.mimeType.indexOf('audio')); 
    if (streamInfo.mimeType.indexOf('audio') === 0) { 
     if (streamInfo.language) { 
    console.log("streamInfo.language: " + streamInfo.language); 
    currentLanguage = i; 
    break; 
     } 
    } 
    } 
} 

if (currentLanguage === null) { 
    currentLanguage = 0; 
} 

i = currentLanguage + 1; 
console.log("i: " + i); 
console.log("currentLanguage: " + currentLanguage); 
while (i !== currentLanguage) { 
    if (i === streamCount) { 
    console.log("resetting i to 0"); 
    i = 0; 
    } 

    streamInfo = protocol.getStreamInfo(i); 
    if (streamInfo.mimeType.indexOf('audio') === 0) { 
    protocol.enableStream(i, true); 
    protocol.enableStream(currentLanguage, false); 

    console.log("Enabling: " + i); 
    console.log("Disabling: " + currentLanguage); 
    break; 
    } 

    i++; 
} 

if (i !== currentLanguage) { 
    console.log("reloading window player" + window.player); 
    window.player.reload(); 
} 
}; 

window.player = null; 
console.log('Application is ready, starting system'); 
window.castReceiverManager = cast.receiver.CastReceiverManager.getInstance(); 
castReceiverManager.start(); 
</script> 
</body> 
</html> 

Chromecast의 콘솔 :

응용 프로그램은 시스템을 시작 준비가 미디어 응용 프로그램을 시작

우리가 가지고 Media Player 라이브러리

시작

매니페스트 프로토콜 .ISM/

streamCount : 0

I : 1

currentLanguage :

:

내가 콘솔 및 사후 로딩에 들어간 다음 명령이라고 0

편집 this.protocol.getStreamCount()

,451,515,

2

그래서 이것은 분명히 타이밍 문제입니다. 스트림이 완전히로드되면 changeLanguage를 호출해야합니다. 전화 할 적절한시기가 언제인지 조사하고 있습니다. 어떤 도움을 주셔서 감사하겠습니다하지만 지금은 타이밍 문제가 긍정적 인 나는이 대답을 구글하려고합니다.

답변

1

대답은 다음과 같습니다

host.onManifestReady = function() { 
    changeLanguage(); 
}; 

이것은 대체 오디오 트랙을 끌어시기에 대한 정확한 타이밍을 제공 할 것입니다.

관련 문제