【发布时间】:2014-03-02 07:34:44
【问题描述】:
我正在使用最新版本的 Chrome Sender(新公开版本的 v1),但在让 HLS 正常工作时遇到了问题。
我的 m3u8 清单是一个“主”播放列表,它指向其他六个不同分辨率和比特率的 m3u8 播放列表,以便根据规范提供自适应比特率流。
此播放列表在我的自定义 Roku 应用程序、我的 iOS 应用程序(也适用于 Apple TV)甚至通过 Flash (JWPlayer Pro) 的浏览器中的作品中都经过了很好的测试。它也可以直接在 iOS 上的 Safari 中运行。我的播放列表唯一有点不同的是它们包含查询字符串参数,这些参数会强制内容过期,但这在 HLS 规范中是允许的。例如:playlist.m3u8?expires=1391662909&signature=I3G8RKUkILOwxjZy8EyL5w%3D%3D%24q0WbXA2whSNFAj0Os3NIpfHkqMA%2BH2iqMMjm0xH2CYKNe3jh1jgl%2FUdS39ve%0AFnL%2F
这是我在 Chrome Sender 中设置播放列表 URL 的代码:
var mediaInfo = new chrome.cast.media.MediaInfo('http://master_playlist_url.m3u8');
mediaInfo.contentType = 'application/x-mpegURL';
var request = new chrome.cast.media.LoadRequest(mediaInfo);
request.autoplay = true;
request.currentTime = 0;
session.loadMedia(request, onMediaDiscovered.bind(this, 'loadMedia'), onMediaError);
媒体未加载,onMediaError 使用包含以下内容的错误对象调用:
code: "session_error"
description: "LOAD_FAILED"
details: null
我还尝试将streamType 设置为chrome.cast.media.StreamType.BUFFERED、chrome.cast.media.StreamType.LIVE 和chrome.cast.media.StreamType.OTHER,每个结果都相同。我也尝试过设置duration,但没有成功。我尝试在 LoadRequest 上删除 autoplay 和 currentTime,但也没有运气。
我的接收器是一个基本的自定义接收器,如下所示:
<html>
<head>
<title>Cast</title>
<script src="//www.gstatic.com/cast/sdk/libs/receiver/2.0.0/cast_receiver.js"></script>
</head>
<body>
<video id='media' width="100%" height="auto" />
<script>
window.onload = function() {
window.mediaElement = document.getElementById('media');
window.mediaManager = new cast.receiver.MediaManager(window.mediaElement);
window.castReceiverManager = cast.receiver.CastReceiverManager.getInstance();
window.castReceiverManager.start();
}
</script>
</body>
</html>
根据更新的文档,现在支持 HLS,但我似乎无法让它工作:https://developers.google.com/cast/docs/media
我还应该提到,当使用渐进式 MP4 并将内容类型更改为 video/mp4 时,此代码可以正常工作。
更新: 我决定尝试从混音中删除主播放列表(自适应比特率流),只使用包含一种质量 TS 片段的单个 m3u8 播放列表。它产生了同样的错误。因此,至少我们知道该问题与自适应比特率流无关,而是与 HLS 支持有关。
【问题讨论】:
标签: http-live-streaming chromecast