为什么 Chromecast 无法流式传输此 HLS 视频? "Neither ID3 nor ADTS header was found"/错误NETWORK/315
Why is Chromecast unable to stream this HLS video? "Neither ID3 nor ADTS header was found" / Error NETWORK/315
我正在尝试通过发送器应用将一些 URL 流式传输到我的 Chromecast。他们是 HLS/m3u8 URLs.
然而,尽管其他 HLS/m3u8 URL 正在工作 (example of an HLS stream that does work),但它们似乎从未加载到 Chromecast 上。
它与 CORS 无关,因为它们确实具有适当的 CORS headers。
我注意到他们在根 HLS 清单文件中有单独的音频组。
当我将它连接到自定义接收器应用程序时,我得到以下日志:
相关位(我认为):ID3 和 ADTS header 均未在 0 和 cast.player.api.ErrorCode.NETWORK/315 处找到(我认为这是第一个的结果)
这些是完美的 valid/working HLS URLs。他们在 iOS 和桌面上的 Safari 以及 VLC 中完美播放。
我需要做些什么(在我的发送者应用程序或我的接收者应用程序中)来启用音轨之类的东西吗? The docs seem to indicate something about that.
我还发现了这个 Google 问题,其中有人遇到过类似的问题,但以某种我无法理解的方式解决了。 https://issuetracker.google.com/u/1/issues/112277373
如何在 Chromecast 上正确播放 URL?我要用代码做点什么吗?
这已经有了解决方案 但我会添加这个答案以防有人查找确切的错误消息/代码。
问题出在 hlsSegmentFormat
,它针对多路复用片段初始化为 TS
,但当前默认为具有备用音轨的 HLS 的打包音频。
解决方法是拦截CAF LOAD
请求并设置正确的段格式:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
// intercept the LOAD request
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.LOAD, loadRequestData => {
loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.TS;
return loadRequestData;
});
context.start();
来源:Google演员issue tracker
对于管理多种格式的多个视频源并且不想随意强制将HLS片段格式强制为TS的人,我建议跟踪错误并设置一个标志以在下次重试时强制格式(默认情况下,接收方在放弃前尝试 3 次。
首先,有一个全局标志来启用 HLS 段格式覆盖:
setHlsSegmentFormat = false;
然后检测错误:
playerManager.addEventListener(cast.framework.events.EventType.ERROR,
event => {
if (event.detailedErrorCode == cast.framework.events.DetailedErrorCode.HLS_NETWORK_INVALID_SEGMENT) {
// Failed parsing HLS fragments. Will retry with HLS segments format set to 'TS'
setHlsSegmentFormat = true;
}
}
);
最后,处理拦截播放请求时的flag:
playerManager.setMediaPlaybackInfoHandler(
(loadRequest, playbackConfig) => {
if (setHlsSegmentFormat) {
loadRequest.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.TS;
// clear the flag to not force the format for subsequent playback requests
setHlsSegmentFormat = false;
}
}
);
第一次播放会很快失败,下次播放会成功。加载时间有点长,但HLS段格式仅在需要时设置。
我正在尝试通过发送器应用将一些 URL 流式传输到我的 Chromecast。他们是 HLS/m3u8 URLs.
然而,尽管其他 HLS/m3u8 URL 正在工作 (example of an HLS stream that does work),但它们似乎从未加载到 Chromecast 上。
它与 CORS 无关,因为它们确实具有适当的 CORS headers。
我注意到他们在根 HLS 清单文件中有单独的音频组。
当我将它连接到自定义接收器应用程序时,我得到以下日志:
相关位(我认为):ID3 和 ADTS header 均未在 0 和 cast.player.api.ErrorCode.NETWORK/315 处找到(我认为这是第一个的结果)
这些是完美的 valid/working HLS URLs。他们在 iOS 和桌面上的 Safari 以及 VLC 中完美播放。
我需要做些什么(在我的发送者应用程序或我的接收者应用程序中)来启用音轨之类的东西吗? The docs seem to indicate something about that.
我还发现了这个 Google 问题,其中有人遇到过类似的问题,但以某种我无法理解的方式解决了。 https://issuetracker.google.com/u/1/issues/112277373
如何在 Chromecast 上正确播放 URL?我要用代码做点什么吗?
这已经有了解决方案
问题出在 hlsSegmentFormat
,它针对多路复用片段初始化为 TS
,但当前默认为具有备用音轨的 HLS 的打包音频。
解决方法是拦截CAF LOAD
请求并设置正确的段格式:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
// intercept the LOAD request
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.LOAD, loadRequestData => {
loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.TS;
return loadRequestData;
});
context.start();
来源:Google演员issue tracker
对于管理多种格式的多个视频源并且不想随意强制将HLS片段格式强制为TS的人,我建议跟踪错误并设置一个标志以在下次重试时强制格式(默认情况下,接收方在放弃前尝试 3 次。
首先,有一个全局标志来启用 HLS 段格式覆盖:
setHlsSegmentFormat = false;
然后检测错误:
playerManager.addEventListener(cast.framework.events.EventType.ERROR,
event => {
if (event.detailedErrorCode == cast.framework.events.DetailedErrorCode.HLS_NETWORK_INVALID_SEGMENT) {
// Failed parsing HLS fragments. Will retry with HLS segments format set to 'TS'
setHlsSegmentFormat = true;
}
}
);
最后,处理拦截播放请求时的flag:
playerManager.setMediaPlaybackInfoHandler(
(loadRequest, playbackConfig) => {
if (setHlsSegmentFormat) {
loadRequest.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.TS;
// clear the flag to not force the format for subsequent playback requests
setHlsSegmentFormat = false;
}
}
);
第一次播放会很快失败,下次播放会成功。加载时间有点长,但HLS段格式仅在需要时设置。