9

我正在尝试通过发件人应用将一些 URL 流式传输到我的 Chromecast。它们是 HLS/m3u8 URL。

这是一个这样的示例 URL:https://qa-apache-php7.dev.kaltura.com/p/1091/sp/109100/playManifest/entryId/0_wifqaipd/protocol/https/format/applehttp/flavorIds/0_h65mfj7f,0_3flmvnwc, 0_m131krws,0_5407xm9j/a.m3u8

然而,尽管其他 HLS/m3u8 URL 正常工作,但它们似乎从未在 Chromecast 上加载(有效的 HLS 流示例)。

它与 CORS 无关,因为它们确实具有正确的 CORS 标头。

我注意到他们在根 HLS 清单文件中有单独的音频组。

当我将它连接到自定义接收器应用程序时,我得到以下日志:

在此处输入图像描述

相关位是(我认为):在 0 和 cast.player.api.ErrorCode.NETWORK/315 处都找不到 ID3 和 ADTS 标头(我相信这是第一个的结果)

这些是完全有效/有效的 HLS URL。它们可以在 iOS 和桌面上的 Safari 以及 VLC 中完美播放。

我需要做些什么(在我的发送者应用程序或我的接收者应用程序中)以启用诸如音轨之类的东西吗?文档似乎表明了这一点

我还发现了这个谷歌问题,一个人有类似的问题,但以某种我无法理解的方式解决了它。https://issuetracker.google.com/u/1/issues/112277373

如何在 Chromecast 上正确播放此 URL?我要在代码中做点什么吗?

4

2 回答 2

7

这已经有一个解决方案但我会添加这个答案,以防有人查找确切的错误消息/代码。

问题在于为多路复用段hlsSegmentFormat初始化,TS但当前默认为带有备用音轨的 HLS 打包音频。

解决方法是拦截CAFLOAD请求并设置正确的段格式:

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 Cast问题跟踪器

于 2019-03-28T08:16:13.090 回答
1

对于管理各种格式的多个视频源并且不想随意将 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 段格式仅在需要时设置。

于 2021-03-24T21:18:28.143 回答