我正在开发一个tvOS应用程序,在这个应用程序中,我使用AVPlayer播放一个HLS播放列表,它为某些语言提供两种格式的音频。例如:
法国航空公司( (EC-3)
我正在尝试显示一个自定义对话框,允许用户在这些曲目之间进行选择。
播放列表如下所示:
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-mp4a.40.2",NAME="Français",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="fr",URI="..."
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-ec-3",NAME="Français",DEFAULT=NO,AUTOSELECT=YES,LANGUAGE="fr",URI="..."
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-mp4a.40.2",NAME="English",DEFAULT=NO,AUTOSELECT=YES,LANGUAGE="en",URI="..."问题是,据我所知,AVPlayer按语言对曲目进行分组,它从不返回所有3首歌曲。
(lldb) po player?.currentItem?.asset.mediaSelectionGroup(forMediaCharacteristic: .audible)
▿ Optional<AVMediaSelectionGroup>
- some : <AVAssetMediaSelectionGroup: 0x283961940, options = (
"<AVMediaSelectionKeyValueOption: 0x2839a5a00, language = fr, mediaType = 'soun', title = Français, default = YES>",
"<AVMediaSelectionKeyValueOption: 0x2839a5b00, language = en, mediaType = 'soun', title = English>"
), allowsEmptySelection = YES>我深入研究了法语项目(player?.currentItem?.asset.mediaSelectionGroup(forMediaCharacteristic: .audible)?.options.first),但仍然找不到任何有用的东西。我还试着从AVPlayer中寻找其他领域,但没有成功。
即使我使用AVPlayerViewController,我也只能看到两条音频曲目可供选择。
有什么办法可以得到所有可用的音轨吗?
发布于 2020-05-15 18:13:24
所以这里的问题实际上是播放列表。如果您检查HLS规范,就会在EXT-X-MEDIA (https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-07#section-4.4.6.1.1)的引渡组小节中解释这一点。
播放列表可能包含相同类型的多个组,以便提供该媒体类型的多个编码。如果这样做,每个相同类型的组必须有相同的成员集,而每个对应的成员必须具有相同的属性,但URI和通道属性除外。
通常,考虑它的方式是,给定GROUP-ID中的任何内容都可以由用户选择(因此AVFoundation向您展示了它)。但是哪个GROUP-ID是由播放机选择的,并且(对于这个场景)这是由播放机所选择的EXT-X-STREAM-INF的AUDIO属性决定的。
如果您希望环绕声音轨是可选的,那么它需要存在于与其他GROUP-ID轨道相同的AUDIO中。如果您没有对清单的控制,您可以通过重写环绕式法语曲目的GROUP-ID (使用类似于Charles的东西)来测试它,从audio-ec-3到audio-mp4a.40.2;之后应该会出现在AVFoundation中。但是,要使HLS保持有效,必须更新所有EXT-X-STREAM-INF标记的EXT-X-STREAM-INF属性,以包含环绕声轨道定义的CODECS (否则可能会出现播放失败)。
如果您想让播放器自己选择,并且您没有环绕声英语曲目,您仍然必须在环绕声组中给出英语选项才能保持有效的HLS,但是您可以让URI与立体声组中定义的相同。同样,在这个场景中必须更新CODECS。
这段来自WWDC的视频很好地解释了这一切(相关部分大约从42:39开始):https://developer.apple.com/videos/play/wwdc2018/502/。
https://stackoverflow.com/questions/59282652
复制相似问题