首页 > 解决方案 > v3 Google Cast 接收器是否会自动解析来自 hls 主播放列表的替代音轨,还是我必须在发送器中定义它们?

问题描述

我正在尝试让多音频 HLS 流在 v3 Google Cast 自定义接收器应用程序上运行。流的主播放列表是指几个不同分辨率的视频再现和两个替代音轨:

#EXTM3U
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="de",NAME="TV Ton",DEFAULT=YES, AUTOSELECT=YES,URI="index_1_a.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="de",NAME="Audiodeskription",DEFAULT=NO, AUTOSELECT=NO,URI="index_2_a.m3u8"
#EXT-X-STREAM-INF:AUDIO="aac",BANDWIDTH=383000,RESOLUTION=320x176,CODECS="avc1.4d001f, mp4a.40.2",CLOSED-CAPTIONS=NONE
index_0_av.m3u8
...more renditions
#EXT-X-STREAM-INF:AUDIO="aac",BANDWIDTH=3697000,RESOLUTION=1280x720,CODECS="avc1.4d001f, mp4a.40.2",CLOSED-CAPTIONS=NONE
index_6_av.m3u8

视频在发送方和接收方应用程序中都可以正常播放,我可以在发送方应用程序中看到两个音轨,但是当投射到接收方时,没有用于更改音轨的控件。

当访问 AudioTracksManager 的 getTracks() 方法同时拦截 LOAD 消息时...

playerManager.setMessageInterceptor(
  cast.framework.messages.MessageType.LOAD, loadRequestData => {
    loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.TS
    const audioTracksManager = playerManager.getAudioTracksManager();
    console.log(audioTracksManager.getTracks())
    console.log('Load request: ', loadRequestData);
    return loadRequestData;
  });

我收到一条错误消息:

未捕获的错误:曲目信息不可用。

也许不相关,但超级奇怪:我可以 console.log 请求的媒体道具并查看它的轨道道具(一个具有预期 1 个视频和 2 个音频轨道的数组),但是,如果我尝试访问 LOAD 消息拦截器中的轨道属性我不确定。

我目前还无法查看 iOS 发送方代码,因此我尝试消除接收方端的错误源。事情是:

我一直假设接收器在加载 HLS 播放列表时会自行识别替代音轨。这个假设是否正确,或者 AudioTracksManager 是否只能访问先前在发送者应用程序中定义的轨道?

我在 Google Cast 参考中找不到明确的声明...

标签: google-casthttp-live-streaming

解决方案


好的,我花在这上面的时间感觉很愚蠢,但我终于能够回答我自己的问题了。我没有意识到我在错误的位置访问 AudioTracksManager - 即在 LOAD 消息拦截器中而不是在 PLAYER_LOAD_COMPLETE 事件侦听器中(因为它在此处正确记录)

将我的逻辑放入此事件侦听器后,我能够访问并以编程方式设置我的音轨。

所以回答我最初的问题:是的,接收器应用程序会自动从 HLS 播放列表中识别替代音轨。


推荐阅读