Chromecast Receiver CAF,无限加载 MPEG-DASH 流,ShakaPlayer 访问
Posted
技术标签:
【中文标题】Chromecast Receiver CAF,无限加载 MPEG-DASH 流,ShakaPlayer 访问【英文标题】:Chromecast Receiver CAF, infinite loading of MPEG-DASH stream, ShakaPlayer access 【发布时间】:2018-06-04 12:40:14 【问题描述】:Chromecast 播放 MPEG-DASH 直播时遇到问题。由于清单中缺少 UTCTiming 标签,会发生无限加载。众所周知,ShakaPlayer 会出现此问题。这是FAQ中的第一个问题:https://github.com/google/shaka-player/blob/master/docs/tutorials/faq.md
但是,在 chromecast 上,我无法直接访问 ShakaPlayer(或者可能有一种我不熟悉的方式)。我能想到的问题有两种解决方案:
-
动态修改清单。
this.playbackConfig.manifestHandler = (manifest) => //将 UTCTiming 添加到具有如下属性的清单中: customUTC.setAttribute("schemeIdUri", "urn:mpeg:dash:utc:http-head:2014"); customUTC.setAttribute("值", this.manifestUrl);
但这并没有改变 chromecast 播放器的行为,仍然会出现无限加载,我在这里做错了吗?
-
通过设置
useLegacyDashSupport
使用旧版播放器(媒体播放器库)可以正常播放chromecast 流,但会稍微破坏UI。我可以仅在需要时动态切换到旧版播放器吗?例如,基于清单,或在来自发件人应用的 loadRequest 期间。
【问题讨论】:
【参考方案1】:UTCTiming
元素是必需的,因为 Shaka Player 需要知道服务器上的时间,以便它可以在正确的时间播放。如果客户端和服务器的时钟时间不同,则视频可能无法播放。这不是Shaka Player的要求,而是DASH的一般要求。
但如果您无法在清单中设置元素,您可以使用manifest.dash.clockSyncUri
(请参阅docs)配置参数来设置要使用的时钟同步 URL。例如:
player.configure(manifest: dash: clockSyncUri: 'https://example.com/clock');
请注意,用于时钟同步的 URL 需要在响应中包含正确的 Date
标头(注意缓存),如果请求是跨域的,则需要公开标头,否则将CORS 错误。
另外,shaka-player#999 是一个帮助漂移的功能请求。在该功能着陆后,播放器将使用清单中的片段来猜测实时边缘,而不是使用时钟时间。这意味着您不必设置时钟同步。
【讨论】:
【参考方案2】:我同意你的看法。这是 shaka 强制使用 UTCTiming 的非常烦人的行为。
如果您可以选择在您的 fork 中修改 shaka-player 代码,我建议您在清单初始化 (check here) 后调用 setClockOffset 方法。清单具有具有 setClockOffset 方法的presentationTimeline。否则,您可以从here 访问清单。为 UTCTiming 触发 setClockOffset 方法。如果您无法为清单设置 UTCTiming,手动设置偏移量可能是您的最佳选择。
示例代码案例是 =>
player.load(manifestUri)
.then(() =>
const manifest = player.getManifest();
const presentationTimeline = manifest.presentationTimeline;
presentationTimeline.setClockOffset(10/* find a suitable offset */);
);
祝你好运!
【讨论】:
以上是关于Chromecast Receiver CAF,无限加载 MPEG-DASH 流,ShakaPlayer 访问的主要内容,如果未能解决你的问题,请参考以下文章
chromecast流程中receiver.html的作用是啥?是必需的吗?
Chromecast 应用程序仅显示 Receiver 应用程序 URL
如何获取在 chromecast 设备上崩溃的 Receiver 应用程序的崩溃日志?