【发布时间】:2013-12-26 20:48:58
【问题描述】:
我正在使用 Chrome API (Cast Chrome) 开发一个非常基本的 HTML5 视频发送器/接收器应用程序,并且在发送器应用程序中的 cast.API.pauseMedia 方法遇到问题。在发送方应用程序中,我有一些按钮可以模仿视频播放器中的按钮来控制接收方的播放。我有一个播放/暂停按钮,它应该根据视频当前正在播放还是暂停来更改它的图像和 onclick 处理程序(playMedia 或 pauseMedia)。为了确保按钮设置为正确的状态,我检查了 playMedia/pauseMedia 的结果,但我遇到的问题是 pauseMedia resultCallback (MediaResult) 总是错误的,带有错误字符串“请求超时”。注意:视频确实在接收器上正确播放/暂停,但暂停总是返回 false,我无法使用结果更新 UI。
以下是相关代码:
function playMedia() {
castApi.playMedia(currentActivityId, new cast.MediaPlayRequest(), function(result) {
console.log("onPlay [activityId: " +result.activityId + "] [result: " + result.success + "] [ErrorString: " + result.errorString + "] [Status: " + JSON.stringify(result.status) + "]");
if (result.success) {
document.getElementById("play-pause").onclick = pauseMedia;
document.getElementById("play-pause").innerHTML = '<i class="fa fa-pause fa-fw"></i>';
}
});
}
function pauseMedia() {
castApi.pauseMedia(currentActivityId, function(result) {
console.log("onPause [activityId: " +result.activityId + "] [result: " + result.success + "] [ErrorString: " + result.errorString + "] [Status: " + JSON.stringify(result.status) + "]");
if (result.success) {
document.getElementById("play-pause").onclick = playMedia;
document.getElementById("play-pause").innerHTML = '<i class="fa fa-play fa-fw"></i>';
}
});
}
这是 console.log 输出:
onPause [activityId: ra06rhvtqgdb] [result: false] [ErrorString: Request timeout] [Status: null]
onPlay [activityId: ra06rhvtqgdb] [result: true] [ErrorString: null] [Status: {"eventSequenceId":85,"activityId":"ra06rhvtqgdb","state":2,"contentId":"http://192.168.1.73/videos/tears_of_steel_1080p.mov","title":null,"imageUrl":null,"timeProgress":false,"position":3,"duration":734.167,"volume":1,"muted":false,"contentInfo":null,"mediaTracks":[],"error":null,"hasPause":null}]
我注意到“状态”(MediaPlayerStatus)包含一个“hasPause”字段,该字段为空。我怀疑这可能与问题有关(是这样吗?),但我不确定是什么控制了该字段的值。 “hasPause”的文档指出:“播放器是否支持 pauseMedia 和 playMedia 命令。大多数接收器应用程序应该支持这个,但是,一些应用程序可能不支持这些功能。”。 playMedia 和 pauseMedia 似乎都在工作(视频确实在接收器处播放和暂停),但“hasPause”始终为空。我是否应该自己在接收方应用程序中设置这个值,如果是,该怎么做?
编辑:添加更多信息,因为 cmets 中没有太多空间。
我在这里使用了 helloChromecast 示例:https://github.com/googlecast/cast-chrome-sender-helloworld 作为起点。我修改了receiver.html 以添加缺少的</video> 标记并添加了onEnded 函数(因此当视频播放完毕等时我会收到通知)。我修改了发件人,以便我可以手动输入视频 URL,并添加了我自己的自定义播放器控件(播放/暂停、搜索栏、视频位置指示器、静音按钮和音量栏等)。我可以使用多种方法使功能正常工作,但这里的目标只是学习 API,所以我试图理解为什么它不能与这里使用的方法一起工作。例如如果我只是忽略了 pauseMedia 的结果,一切正常,我还可以调用 getMediaStatus 来验证 playerstate 以保持按钮同步等,但这并不能帮助我理解为什么 pauseMedia 总是返回 false,或者为什么 hasPause始终为空,等等。
【问题讨论】: