2014-11-10 2 views
-1

내 응용 프로그램에서 사용자는 비디오가 끝난 후 처음부터 다시 시작할 수 있습니다.chromecast 리시버 <video> onEnded

구현하려면 사용자 지정 수신기에서 수신기 라이브러리 MediaManager.onEnded() 메서드를 재정 의하여이 메서드의 기본 동작 인 resetMediaElement을 호출하는 대신 보낸 사람에게 사용자 지정 메시지를 보냅니다. 이때

, 사용자는 플레이 버튼을 적중하고, 송신기는 수신기가 <video> 라이브러리 요소에 play() 메소드를 호출하게한다 RemoteMediaPlayer.play() 메소드를 호출한다.

대신 수신자 라이브러리는 INVALID REQUEST, INVALID_MEDIA_SESSSION_ID라는 메시지를 보냅니다.

또한. 수신기 라이브러리는 미디어 세션 ID가 아직 유효하지 않습니다 있도록

예기치 않은 명령은, 플레이어가 IDLE 상태에 있습니다 "라는 메시지를 로그인 한

그러나 수신기에서 마지막 상태 업데이트는 플레이어를 보여줍니다 수신기와 발신자 로그 모두에서 재생 상태에서 여기

수신기 로그입니다.

::mmOnLoad() mediacast.js:480 
url: http://192.168.1.50/apps/chromecast/videos/Inside%20Diamond%20Head-0001.mp4 mediacast.js:498 
duration: 0 mediacast.js:500 
::showVideo()- message:[object Object] mediacast.js:257 
url:http://192.168.1.50/apps/chromecast/videos/Inside%20Diamond%20Head-0001.mp4 mediacast.js:259 
::fadeOutOldMediaElement() mediacast.js:384 
::mmOnLoad()- presenting video from http://192.168.1.50/apps/chromecast/videos/Inside%20Diamond%20Head-0001.mp4, duration 0 mediacast.js:552 
::fadeOutOldMediaElement0() mediacast.js:393 
::videoFadedOut()- url: http://192.168.1.50/apps/chromecast/videos/Inside%20Diamond%20Head-0001.mp4 mediacast.js:265 
::videoFadedOut()- setting media element [object HTMLVideoElement] mediacast.js:279 
::removeMediaElementOrOverlay() mediacast.js:398 
::removeOldMediaElement() mediacast.js:432 
::removeOverlay() mediacast.js:427 
[ 40.701s] [cast.receiver.MediaManager] Metadata loaded 
cast_receiver.javascript:574 
[ 40.736s] [cast.receiver.MediaManager] Sending broadcast status message 
cast_receiver.javascript:574 
>>>>>the media element state is paused mediacast.js:603 
media element networkState = 2, readyState = 1 mediacast.js:605 
[ 40.802s] [cast.receiver.IpcChannel] IPC message sent: {"namespace":"urn:x-cast:com.google.cast.media","senderId":"*:*","data":"{\"type\":\"MEDIA_STATUS\",\"status\":[{\"mediaSessionId\":1,\"playbackRate\":1,\"playerState\":\"PAUSED\",\"currentTime\":0,\"supportedMediaCommands\":15,\"volume\":{\"level\":0.06666666666666667,\"muted\":false},\"media\":{\"customData\":{\"volume\":0.06666666666666667,\"pauseAfter\":true,\"pauseBefore\":true,\"rotation\":0},\"streamType\":\"BUFFERED\",\"duration\":42.4,\"contentType\":\"video/mp4\",\"contentId\":\"http://192.168.1.50/apps/chromecast/videos/Inside%20Diamond%20Head-0001.mp4\",\"metadata\":{\"metadataType\":1}}}],\"requestId\":1}"} 
cast_receiver.javascript:574 
::videoLoaded() mediacast.js:291 
::videoLoaded0() mediacast.js:302 
::addVideo() mediacast.js:421 
::videoLoaded1() mediacast.js:309 
[ 48.434s] [cast.receiver.IpcChannel] Received message: {"data":"{\"type\":\"PLAY\",\"requestId\":2,\"mediaSessionId\":1}","namespace":"urn:x-cast:com.google.cast.media","senderId":"51:name.renkel.james.mediacast-6"} 
cast_receiver.javascript:574 
[ 48.440s] [cast.receiver.CastMessageBus] Dispatching CastMessageBus message [urn:x-cast:com.google.cast.media, 51:name.renkel.james.mediacast-6]: {"type":"PLAY","requestId":2,"mediaSessionId":1} 
cast_receiver.javascript:574 
[ 48.446s] [cast.receiver.MediaManager] MediaManager message received [51:name.renkel.james.mediacast-6] {"type":"PLAY","requestId":2,"mediaSessionId":1} 
cast_receiver.javascript:574 
[ 48.449s] [cast.receiver.MediaManager] Dispatching MediaManager play event 
cast_receiver.javascript:574 
[ 48.457s] [cast.receiver.MediaManager] onPlay 
cast_receiver.javascript:574 
[ 48.473s] [cast.receiver.MediaManager] Sending broadcast status message 
cast_receiver.javascript:574 
>>>>>the media element state is buffering mediacast.js:603 
media element networkState = 1, readyState = 4 mediacast.js:605 
[ 48.491s] [cast.receiver.IpcChannel] IPC message sent: {"namespace":"urn:x-cast:com.google.cast.media","senderId":"*:*","data":"{\"type\":\"MEDIA_STATUS\",\"status\":[{\"mediaSessionId\":1,\"playbackRate\":1,\"playerState\":\"BUFFERING\",\"currentTime\":0.033322,\"supportedMediaCommands\":15,\"volume\":{\"level\":0.06666666666666667,\"muted\":false}}],\"requestId\":2}"} 
cast_receiver.javascript:574 
[ 49.071s] [cast.receiver.MediaManager] Buffering state changed, isPlayerBuffering: false old time: 0.033322 current time: 0.433322 
cast_receiver.javascript:574 
[ 49.077s] [cast.receiver.MediaManager] Sending broadcast status message 
cast_receiver.javascript:574 
>>>>>the media element state is playing mediacast.js:603 
media element networkState = 2, readyState = 4 mediacast.js:605 
[ 49.090s] [cast.receiver.IpcChannel] IPC message sent: {"namespace":"urn:x-cast:com.google.cast.media","senderId":"*:*","data":"{\"type\":\"MEDIA_STATUS\",\"status\":[{\"mediaSessionId\":1,\"playbackRate\":1,\"playerState\":\"PLAYING\",\"currentTime\":0.433322,\"supportedMediaCommands\":15,\"volume\":{\"level\":0.06666666666666667,\"muted\":false}}],\"requestId\":0}"} 
cast_receiver.javascript:574 
::onEnded(VIDEO) mediacast.js:369 
::onEnded- network state:1 mediacast.js:370 
::onEnded- ready state:4 mediacast.js:371 
::onEnded-  paused:true mediacast.js:372 
::onEnded-   ended:true mediacast.js:373 
::sendMessage({"indication":"ended"}) mediacast.js:108 
[ 90.955s] [cast.receiver.IpcChannel] IPC message sent: {"namespace":"urn:x-cast:name.renkel.james.mediacast","senderId":"51:name.renkel.james.mediacast-6","data":"{\"indication\":\"ended\"}"} 
cast_receiver.javascript:574 
[110.341s] [cast.receiver.IpcChannel] Received message: {"data":"{\"type\":\"PLAY\",\"requestId\":3,\"mediaSessionId\":1}","namespace":"urn:x-cast:com.google.cast.media","senderId":"51:name.renkel.james.mediacast-6"} 
cast_receiver.javascript:574 
[110.350s] [cast.receiver.CastMessageBus] Dispatching CastMessageBus message [urn:x-cast:com.google.cast.media, 51:name.renkel.james.mediacast-6]: {"type":"PLAY","requestId":3,"mediaSessionId":1} 
cast_receiver.javascript:574 
[110.358s] [cast.receiver.MediaManager] Unexpected command, player is in IDLE state so the media session ID is not valid yet 
cast_receiver.javascript:574ib cast_receiver.javascript:574gb.Gb cast_receiver.javascript:562B.log cast_receiver.javascript:361E cast_receiver.javascript:412Z.M cast_receiver.javascript:1654W.ra cast_receiver.javascript:1181Hb cast_receiver.javascript:885g.dispatchEvent cast_receiver.javascript:856g.M cast_receiver.javascript:1104Hb cast_receiver.javascript:885g.dispatchEvent cast_receiver.javascript:856g.M cast_receiver.javascript:968 
[110.362s] [cast.receiver.MediaManager] Sending error message to 51:name.renkel.james.mediacast-6 
cast_receiver.javascript:574 
[110.368s] [cast.receiver.IpcChannel] IPC message sent: {"namespace":"urn:x-cast:com.google.cast.media","senderId":"51:name.renkel.james.mediacast-6","data":"{\"requestId\":3,\"type\":\"INVALID_REQUEST\",\"reason\":\"INVALID_MEDIA_SESSION_ID\"}"} 
cast_receiver.javascript:574 

그리고 여기 t이다 그는 보낸 사람 로그 :

11-10 13:36:36.631: D/MC_Sender(15051): ::showVideo()- url: http://192.168.1.50/apps/chromecast/videos/Inside%20Diamond%20Head-0001.mp4 11-10 13:36:36.732: D/MC_MainActivity.PagerAdapter(15051): ::setPrimaryItem(0) 
11-10 13:36:36.732: D/MC_MainActivity(15051): ::setContentPosition(0) 
11-10 13:36:40.325: D/MC_MediaPlayer(15051): ::onMessageReceived(): device-TV Room; namespace-urn:x-cast:com.google.cast.media; message-{"type":"MEDIA_STATUS","status":[{"mediaSessionId":2,"playbackRate":1,"playerState":"PAUSED","currentTime":0,"supportedMediaCommands":15,"volume":{"level":0.06666666666666667,"muted":false},"media":{"customData":{"volume":0.06666666666666667,"pauseAfter":true,"pauseBefore":true,"rotation":0},"streamType":"BUFFERED","duration":42.4,"contentType":"video/mp4","contentId":"http://192.168.1.50/apps/chromecast/videos/Inside%20Diamond%20Head-0001.mp4","metadata":{"metadataType":1}}}],"requestId":4} 
11-10 13:36:40.375: D/MC_Listeners(15051): ::onStatusUpdated()- playerState=PAUSED 
11-10 13:36:40.426: D/MC_Runner(15051): ::onSenderStateChange(PAUSED)- runState=LOADING 
11-10 13:36:40.426: D/MC_Runner(15051): ::setRunState(RUNNING)- stopWhenRunning=false 
11-10 13:36:40.426: D/MC_CastFragment(15051): ::runnerUpdate() 
11-10 13:36:40.456: D/MC_Listeners(15051): ::onStatusUpdated()- playerState=PAUSED 
11-10 13:36:40.456: D/MC_Listeners(15051): ::onMetadataUpdated()- mediaType=MOVIE 
11-10 13:36:40.516: D/MC_MainActivity.PagerAdapter(15051): ::setPrimaryItem(0) 
11-10 13:36:40.516: D/MC_MainActivity(15051): ::setContentPosition(0) 
11-10 13:36:40.806: D/MC_Sender(15051): ::loadMedia()- statusCode: 0; success: true 
11-10 13:36:40.806: D/MC_Runner(15051): LoadCallback::callback(true): wasStopped=false 
... 
11-10 13:38:47.201: D/MC_Sender(15051): ::playMedia() 
11-10 13:38:47.391: D/MC_MediaPlayer(15051): ::onMessageReceived(): device-TV Room; namespace-urn:x-cast:com.google.cast.media; message-{"type":"MEDIA_STATUS","status":[{"mediaSessionId":1,"playbackRate":1,"playerState":"BUFFERING","currentTime":0.033322,"supportedMediaCommands":15,"volume":{"level":0.06666666666666667,"muted":false}}],"requestId":2} 
11-10 13:38:47.411: D/MC_Listeners(15051): ::onStatusUpdated()- playerState=BUFFERING 
11-10 13:38:47.531: D/MC_Runner(15051): ::onSenderStateChange(BUFFERING)- runState=RUNNING 
11-10 13:38:47.671: D/MC_MainActivity.PagerAdapter(15051): ::setPrimaryItem(0) 
11-10 13:38:47.671: D/MC_MainActivity(15051): ::setContentPosition(0) 
11-10 13:38:48.372: D/MC_Sender(15051): ::playMedia()- statusCode: 0; success: true 
11-10 13:38:48.382: D/MC_MediaPlayer(15051): ::onMessageReceived(): device-TV Room; namespace-urn:x-cast:com.google.cast.media; message-{"type":"MEDIA_STATUS","status":[{"mediaSessionId":1,"playbackRate":1,"playerState":"PLAYING","currentTime":0.6,"supportedMediaCommands":15,"volume":{"level":0.06666666666666667,"muted":false}}],"requestId":0} 
... 
11-10 13:39:29.736: D/MC_Listeners(15051): ::onMessageReceived()- nameSpace: urn:x-cast:name.renkel.james.mediacast; message: {"indication":"ended"} 
11-10 13:39:29.806: D/MC_Runner(15051): ::onSenderStateChange(ENDED)- runState=RUNNING 
... 
11-10 13:42:19.918: D/MC_CastFragment(15051): ::onClick() 
11-10 13:42:19.918: D/MC_Sender(15051): ::playMedia() 
11-10 13:42:20.398: D/MC_MediaPlayer(15051): ::onMessageReceived(): device-TV Room; namespace-urn:x-cast:com.google.cast.media; message-{"requestId":3,"type":"INVALID_REQUEST","reason":"INVALID_MEDIA_SESSION_ID"} 
11-10 13:42:20.418: D/MC_Sender(15051): ::playMedia()- statusCode: 1; success: false 

답변

0

일단 비디오가 끝나면 resetMediaElement가 호출되는지 여부에 관계없이 IDLE 상태로 이동한다고 생각합니다. 상태를 IDLE로 지정할 수있는 이유는 다음과 같습니다. https://developers.google.com/cast/docs/reference/receiver/cast.receiver.media.IdleReason.

그것의 비트 로터리하지만 https://developers.google.com/cast/docs/reference/receiver/cast.receiver.MediaManager에 나열된 방법을 기반으로, 당신은 할 수 : 비디오가 성공적으로)

2

재생 완료 cast.receiver.media으로 유휴 이유를 설정하면

1) 확인 .IdleReason.FINISHED

발신자가 customizedStatusCallback()을 재정 의하여 상태 및 유휴 이유를 확인하고 상태를 변경하여 발신자에게 보내 올바르게 재생할 수 있습니다.

+0

예를 들어, 요소가

+0

OnEnded() 메서드를 제공 할 수 있습니까? –

+0

수신자의 onEnded() 메소드는 다음과 같습니다. 'function onEnded() { if (pauseAfter) { var event = new Event ("pause"); mediaElement.dispatchEvent (event); 은 ("종료 됨", {})을 나타냅니다. } else { mediaManager.resetMediaElement ( cast.receiver.media.IdleReason.FINISHED); } } mediaElement는