[英]Select channels and subtitles in AVPlayer from m3u8 playlists on tvOS swift
遵循 Apple 的官方文档:[https://developer.apple.com/documentation/avfoundation/media_playback_and_selection/selecting_subtitles_and_alternative_audio_tracks]
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只有两个轨道(视频和音频),即使流有更多的音频轨道。
如何使用标准的 AVPlayer 和 AVFoundation 框架从 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:
()
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.