11

使用Google CAF Receiver SDK,当我们不使用接收器播放器时,我们如何防止接收器超时并自动终止投射会话?

标准的 Google Cast 用例是将媒体从设备发送到投射接收器,并让接收器使用播放器渲染媒体。CAF 接收器 SDK使用element 以美观、简单的方式提供此功能cast-media-player

但是对于那些我们想要从设备投射并渲染与使用无关的内容cast-media-player(例如 HTML 仪表板)的情况,我们如何让接收器保持活动状态?

例如,以下自定义接收器(为简洁起见为 HAML)导致投射会话在 5 分钟后自动终止......

!!! 5
%html
  %head
    :css
      cast-media-player {
        display: none;
      }

    = javascript_include_tag 'https://www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js'
  %body
    %cast-media-player

    :javascript
      const context = cast.framework.CastReceiverContext.getInstance();
      const player = context.getPlayerManager();

      player.setMessageInterceptor(cast.framework.messages.MessageType.LOAD, loadRequestData => {
        ...[load custom view]...
        return false;
      });

      context.start();

接收器日志显示线路cast.framework.common.IdleTimeoutManager] timer expired,然后关闭。此处显示的示例接收器日志。

我试过了:

  • 将cast.framework.CastReceiverOptions #maxInactivity增加到一个非常大的数字
  • 定期从发送方加载新数据
  • 定期从接收方向发送方发送自定义消息
  • 定期从发送方向接收方发送自定义消息

很感谢任何形式的帮助!

4

4 回答 4

7

我在开发不播放媒体的自定义接收器应用程序时遇到了同样的问题。这是我实施的解决方案:

var idleTime = 0;

const context = cast.framework.CastReceiverContext.getInstance();

const CUSTOM_CHANNEL = '[MY CHANNEL HERE]';

context.addCustomMessageListener(CUSTOM_CHANNEL, function(customEvent) {
    var eventData = customEvent.data;
    parseCommand(eventData);
    idleTime = 0;
});


const options = new cast.framework.CastReceiverOptions();

options.disableIdleTimeout = true;

context.start(options);

var idleInterval = setInterval(timerIncrement, 60000); // 1 minute

function timerIncrement() {
    idleTime = idleTime + 1;
    if (idleTime > 4) { // 5 minutes
        context.stop();
    }
}

使用 CastReveiverOptions 我禁用空闲超时,根据文档:“如果为真,如果没有活动,接收器将不会设置空闲超时来关闭接收器。应该只用于非媒体应用程序。” https://developers.google.com/cast/docs/reference/caf_receiver/cast.framework.CastReceiverOptions#constructor_1

由于我的是“非媒体应用”,我相信这是正确的用法。然后,我根据自定义频道中的 5 分钟不活动设置自己的超时时间。

于 2018-11-01T21:21:52.857 回答
5

我想出了一种替代方法来阻止这种情况,它比定期发送无声剪辑更有效,但感觉很脏。setTimeout基本上,由于没有媒体,我们必须阻止 Chromecast触发和关闭连接。最快的解决方案是在加载 Chromecast 接收器脚本之前简单地重新声明setTimeout为虚拟无操作函数。在这种情况下,它似乎并没有破坏任何与 Chromecast 相关的内容,因为看起来 Chromecast 的超时都与与此用例无关的视频有关。

window._setTimeout = window.setTimeout;
window.setTimeout = function(a, b) {
    // disable setTimeout so chromecast won't kill us after 5 minutes...
};

然后在我们自己的应用程序中,如果我们需要使用我们调用的超时_setTimeout

如果有人发现了一种更好的方法来实现这一点,我会很感兴趣,除了手动托管cast_receiver_framework.js并注释掉有问题的行(在Wn(a, b)函数内部)或每隔几分钟发送一个无声剪辑。但谷歌不推荐自托管。

更好的解决方案可能是深入挖掘缩小的代码以找出Xn(a)调用方式,因为它会在媒体播放时禁用超时,然后找到一种从 Chromecast 应用程序中调用它的方法。

于 2018-03-15T03:49:01.447 回答
0

每 4 分钟从发送方加载一段听不见的短音频片段到接收方似乎可以解决问题。如果文件很小,这不会对性能产生太大影响。这是一些安卓代码。

    MediaMetadata metadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MUSIC_TRACK);

    MediaInfo mediaInfo = new MediaInfo.Builder("https://some-inaudible-clip.mp3")
            .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
            .setContentType("audio/mpeg")
            .setMetadata(metadata)
            .build();

    RemoteMediaClient remoteMediaClient = castSession.getRemoteMediaClient();

    remoteMediaClient.load(mediaInfo, true);
于 2017-12-30T14:27:42.810 回答
-3

可以将自定义命名空间消息从接收方发送到发送方。那应该保持心跳。但是,Cast SDK 不直接支持您的用例,因此您必须尝试解决方案。

于 2017-10-10T20:37:11.917 回答