2016-03-15 1 views
1

У меня есть важный вопрос: я управляю потоком потока на моем ресивере, но я хочу использовать сообщение остановки от моего отправителя для остановки потока. В настоящее время я использую этот отправитель (https://github.com/googlecast/CastVideos-android) и этот ресивер (https://github.com/googlecast/CastReferencePlayer), но проблема в том, что отправитель посылает мне команду на паузу, а не на остановку во время live. В документации, стороннем отправителе Android, я читаю, что поведение правильное, и получатель должен отправить сообщение обновления состояния мультимедиа обратно отправителю и должен сообщить о состоянии как MediaStatus.PLAYER_STATE_IDLE с причиной MediaStatus.IDLE_REASON_CANCELLED.Chromecast: Управление событием остановки (не пауза) в приемнике от отправителя Android

Прибыл в этот момент. Я хочу изменить приемник и управлять паузой как остановку, а не как паузу. Я хочу управлять остановкой, потому что, когда отправитель нажимает кнопку остановки, ресивер должен остановить видео, а отправитель должен уничтожить «каждого игрока» (игрока, мини-игрока и т. Д.).

Так Моя идея заключается в следующем:

sampleplayer.CastPlayer.prototype.onPause_ = function() { 
    this.log_('onPause'); 
    this.cancelDeferredPlay_('media is paused'); 
    var isIdle = this.state_ === sampleplayer.State.IDLE; 
    var isDone = this.mediaElement_.currentTime === this.mediaElement_.duration; 
    var isUnderflow = this.player_ && this.player_.getState()['underflow']; 
    if (isUnderflow) { 
    this.log_('isUnderflow'); 
    this.setState_(sampleplayer.State.BUFFERING, false); 
    this.mediaManager_.broadcastStatus(/* includeMedia */ false); 
    } else if (!isIdle && !isDone) { 
    this.setState_(sampleplayer.State.PAUSED, false); 
    } else if(this.isLiveStream) { 
    this.log_('onStop'); 
    this.cancelDeferredPlay_('media is stopped'); 
    var self = this; 
    sampleplayer.transition_(self.element_, sampleplayer.TRANSITION_DURATION_, 
     function() { 
     self.setState_(sampleplayer.State.IDLE, false); 
     self.resetMediaElement_(); 
     self.mediaManager_.setIdleReason("CANCELLED"); 
    }); 

    return ; 
    } 
    this.updateProgress_(); 
}; 

Как вы можете видеть в третьем Branc, я контролирую переменный, я сохраненный во время загрузки видео и после того, как я поставил состояние игрока IDLE, перезагрузите mediaElement и, наконец, отправлю для трансляции State = IDLE и Reason = CANCELED. Таким образом, отправитель видит сообщение, потому что я смотрю журнал, но не интерпретирую это.

Теперь я не знаю, как продолжать и управлять этим поведением. Совет приветствуется. Спасибо.

ответ

1

Чтобы убедиться, что мой ответ освещает ваш вопрос, позвольте мне упростить ваши вопросы следующим образом: при воспроизведении живого потока вы хотите по-прежнему видеть кнопку «Стоп» на стороне отправителя, но если пользователь нажимает эту кнопку, вы хотите остановить воспроизведение и выгрузить носитель.

Если это правильно, вы также можете добиться этого со стороны отправителя: CastVideos-android использует CastCompanionLibrary. Есть два места, которые необходимо обновить в этой библиотеке: в VideoCastManager#togglePlayback() и VideoCastControllerFragment#togglePlayback(). В прежнем месте, вам необходимо обновить условную там читать, как в следующем:

if (isPlaying && isRemoteStreamLive()) { 
    stop(); 
} else if (isPlaying) { 
    pause(); 
} else { 
... //leave as is 
} 

В последнем случае вам необходимо обновить один из утверждений переключателя:

case MediaStatus.PLAYER_STATE_PLAYING: 
    if (mSelectedMedia.getStreamType() == MediaInfo.STREAM_TYPE_LIVE) { 
     mCastManager.stop(); 
     mPlaybackState = MediaStatus.PLAYER_STATE_IDLE; 
    } else { 
     mCastManager.pause(); 
     mPlaybackState = MediaStatus.PLAYER_STATE_BUFFERING; 
    } 
    break; 

В принципе, вы добавляет логику, что если контент воспроизводится удаленно, «переключение воспроизведения» должно вызывать stop(), а не pause() при работе с потоком в прямом эфире.

Обратите внимание, что вызов stop() означает, что вы полностью разгружаете свои носители, и вам может потребоваться выполнить дополнительную работу, чтобы воспроизвести другой носитель, но я не тестировал это, так как я не вызываю stop() в приложении CastVideos. Также обратите внимание, что я не тестировал/не пробовал вышеуказанное предложение, так как у меня нет прямого эфира, но я надеюсь, что это сработает.