【问题标题】:AVPlayer - Retrieve audio tracks in all formatsAVPlayer - 检索所有格式的音轨
【发布时间】:2020-04-04 13:12:13
【问题描述】:

我正在开发一个 tvOS 应用程序,我正在使用 AVPlayer 播放 HLS 播放列表,该列表为某些语言提供两种格式的音频。例如:

  • 法语 (AAC)
  • 法语 (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,我也只能看到两个音轨可供选择。

有什么方法可以获取所有可用的音轨吗?

【问题讨论】:

    标签: ios avplayer http-live-streaming tvos


    【解决方案1】:

    所以这里的问题实际上是播放列表。如果您查看 HLS 规范,则在 EXT-X-MEDIA (https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-07#section-4.4.6.1.1) 的 Rendition Groups 小节下有一些注释对此进行了解释

    一个播放列表可以包含多个相同类型的组,以便 提供该媒体类型的多种编码。如果这样做,每个 相同类型的组必须具有相同的成员集,并且每个 相应的成员必须具有与 URI 和 CHANNELS 属性除外。

    一般来说,考虑它的方式是,给定GROUP-ID 中的任何内容都可以由用户选择(因此 AVFoundation 会向您显示)。但是播放的是哪个GROUP-ID 是由玩家选择的,并且(对于这种情况)这是由玩家选择的EXT-X-STREAM-INFAUDIO 属性决定的。

    如果您希望环绕声轨道可选择,则它需要与其他 AUDIO 轨道存在于同一 GROUP-ID 中。如果您无法控制清单,您可以通过重写环绕法语轨道的GROUP-ID(使用类似Charles Proxy)从audio-ec-3audio-mp4a.40.2 进行测试;之后它应该出现在 AVFoundation 中。但是需要注意的是,要使 HLS 保持有效,必须更新所有 EXT-X-STREAM-INF 标签的 CODECS 属性以包含环绕轨道定义的 CODECS(否则可能会出现播放失败)。

    如果您想让播放器选择它,并且您没有环绕英语曲目,您仍然需要在环绕组中提供英语选项以保持有效的 HLS,但您可以只留下 @ 987654336@ 与立体声组中定义的相同。在这种情况下,CODECS 必须再次更新。

    来自 WWDC 的这段视频很好地解释了所有这些(相关部分从 42:39 开始):https://developer.apple.com/videos/play/wwdc2018/502/

    【讨论】:

      猜你喜欢
      • 2011-10-07
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多