Google Cast定制接收器超时

时间:2017-10-10 18:04:50

标签: chromecast google-cast google-cast-sdk caf-receiver-sdk

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

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

但是对于那些我们想要从设备进行投射并呈现与使用cast-media-player无关的内容(例如HTML仪表板)的情况,我们如何让接收器保持活着?< / p>

以下自定义接收器(简称为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,然后关闭。示例接收者日志shown here

我试过了:

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:5)

我想出了另一种方法来阻止它,这比定期发送静音剪辑更有效,但感觉很脏。基本上我们必须阻止Chromecast的setTimeout由于没有媒体而触发和关闭连接。最快的解决方案是在加载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)函数内)或发送无声片段每隔几分钟。但Google不建议自托管。

更好的解决方案可能是深入研究缩小的代码,以确定调用Xn(a)的方式,因为无论何时媒体播放都会禁用超时,然后找到一种方法从Chromecast应用中调用它。

答案 1 :(得分:1)

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

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禁用了空闲超时,根据文档所述:“如果为true,则接收器将不会设置空闲超时以在没有活动的情况下关闭接收器。仅应用于非媒体应用程序。” https://developers.google.com/cast/docs/reference/caf_receiver/cast.framework.CastReceiverOptions#constructor_1

由于我的是“非媒体应用”,因此我认为这是正确的用法。 然后,我根据自己的自定义渠道闲置5分钟来设置自己的超时时间。

答案 2 :(得分:0)

每4分钟从发送器向接收器加载一个短的听不见的音频片段似乎可以解决问题。如果文件很小,这不应该影响性能。这是一些Android代码。

    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);

答案 3 :(得分:-2)

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