从tvOS swift上的m3u8播放列表中选择AVPlayer中的频道和字幕



遵循Apple链接的官方文档

self.playerStatusObserver = player.observe(.currentItem?.status, options: [.new,.old]{ (player, change) in
switch (player.status) {
case .readyToPlay:
player.appliesMediaSelectionCriteriaAutomatically = false
for characteristic in player.currentItem!.asset.availableMediaCharacteristicsWithMediaSelectionOptions {
print("(characteristic)")
// Retrieve the AVMediaSelectionGroup for the specified characteristic.
if let group = player.currentItem!.asset.mediaSelectionGroup(forMediaCharacteristic: characteristic) {
// Print its options.
for option in group.options {
print("  Option: (option.displayName)")
}
}
}

player.currentItem!.asset.availableMediaCharacteristicsWithMediaSelectionOptions没有项目。尝试了许多情况,但player.currentItem?.tracks只有两个音轨(视频和音频(,即使流有更多的音轨。

如何使用标准AVPlayerAVFoundation框架从m3u8流中选择音轨和字幕?

您的代码依赖于准备播放的当前项目来访问availableMediaCharacteristics。可能发生的情况是,availableMediaCharacteristics实际上在那一刻仍然不可用,除非您创建了具有属性automaticallyLoadedAssetKeys参数的玩家项目:

AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: ["availableMediaCharacteristicsWithMediaSelectionOptions"])

您可以在以下页面上找到更多相关信息:https://developer.apple.com/documentation/avfoundation/avplayeritem/1388633-automaticallyloadedassetkeys

根据您的使用情况,您也可以更喜欢异步加载媒体特性,您可以使用以下代码来完成此操作:

func preloadAssetKeys() {
let key = "availableMediaCharacteristicsWithMediaSelectionOptions"

asset.loadValuesAsynchronously(forKeys: [key]) {
[weak self] in
guard let self = self else { return }
var error: NSError? = nil
switch self.asset.statusOfValue(forKey: key, error: &error) {
case .loaded:
// ℹ️ At this point is when availableMediaCharacteristics are actually available
()
default:
()
}
}
}

最新更新