Chromecast:管理来自发件人Android的接收器中的停止事件(不暂停)

时间:2016-03-15 20:03:19

标签: android ios chromecast google-cast

我有一个重要问题:我在接收器上管理流量流但我想使用发送方的停止消息来停止流。目前我正在使用此发件人(https://github.com/googlecast/CastVideos-android)和此接收者(https://github.com/googlecast/CastReferencePlayer),但问题是发件人向我发送暂停的命令,而不是在现场停止。 在文档中,侧面发送者Android,我读到行为是正确的,接收者必须将媒体状态更新消息发送回发件人,并且应该将状态报告为MediaStatus.PLAYER_STATE_IDLE,原因是MediaStatus.IDLE_REASON_CANCELLED。

到此时我想修改样本接收器并像停顿那样管理暂停而不是暂停。我想管理停止,因为当发件人点击停止按钮时,接收者必须停止视频,发送者必须销毁“每个玩家”(玩家,迷你等)。

所以我的想法是这样的:

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_();
};

正如你在第三个分支中所看到的,我控制了一个在视频加载过程中保存的变量,在我将播放器状态设置为IDLE之后,重置mediaElement,最后我发送广播状态= IDLE和原因=取消。通过这种方式,发件人可以看到该消息,因为我查看了日志,但没有解释它。

现在我不知道如何继续和管理这种行为。建议是受欢迎的。谢谢。

1 个答案:

答案 0 :(得分:1)

为了确保我的答案涵盖您的问题,让我简化您的问题如下:在播放直播时,您仍希望看到"停止"发送方的按钮,但如果用户点击该按钮,则需要停止播放并卸载媒体。

如果这是正确的,你也可以从发送方那里实现:CastVideos-android使用CastCompanionLibrary。您需要在该库中更新两个位置: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;

在后一种情况下,您需要更新其中一个switch语句:

stop()

基本上,您正在添加一个逻辑,如果内容是远程播放,"切换播放"在处理直播时应该致电pause()而不是stop()

请注意,拨打stop()表示您正在完全卸载媒体,而您可能需要做一些额外的工作来播放其他媒体,但我还没有通过测试,因为我没有打电话给{{ 1)}在CastVideos应用程序中。另请注意,我没有测试/尝试过上述建议,因为我没有现场直播,但我希望它能起作用。