使用Google CAF接收器SDK,当我们不使用接收器播放器时,我们如何防止接收器超时并自动终止播放会话?
标准的谷歌播放用例是将媒体从设备发送到播放接收器,并让接收器使用播放器渲染媒体。CAF接收器SDK使用元素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增加到一个非常大的数字
- 定期从发件人加载新数据
- 定期从接收方向发送方发送自定义消息
- 定期从发送方向接收方发送自定义消息
非常感谢您的帮助!
我在开发一个不播放媒体的自定义接收器应用程序时遇到了同样的问题。这是我实现的解决方案:
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分钟的不活动时间设置自己的休息时间。
我找到了一种替代方法来阻止这种情况,它比定期发送无声剪辑更有效,但感觉很脏。基本上,由于没有媒体,我们必须阻止Chromecast的setTimeout
启动并关闭连接。最快的解决方案是在加载Chromecast接收器脚本之前,简单地将setTimeout
重新声明为伪no-op函数。在这个场景中,它似乎没有破坏任何与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应用程序中找到调用方法。
每隔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);
可以从接收方向发送方发送自定义名称空间消息。这应该能让心跳保持活力。但是,Cast SDK并不直接支持您的用例,因此您必须对解决方案进行实验。