我正在做一个项目,其中我有一个AVPlayer的实例,能够播放不同的音频内容,我从后端检索,从播客到音乐和流。每个内容都有两种类型的urls:一种是带有mp3的,另一种是带有m3u8文件的。所有的mp3文件都工作正常。但是,有些m3u8文件运行正常,而另一些则不行。特别是那些不工作的文件会导致AVPlayer崩溃,并显示错误:
Error Domain=AVFoundationErrorDomain Code=-11819 "Cannot Complete Action"
UserInfo={NSLocalizedRecoverySuggestion=Try again later.,
NSLocalizedDescription=Cannot Complete Action.}
我不明白问题出在哪里。根据this answer的说法,这是一个错误的清单文件,在我的例子中是-例如-以下:
#EXTM3U
#EXT-X-MEDIA:TYPE=AUDIO,URI="_64/index.m3u8",GROUP-ID="2@48000-64000",NAME="AAC 64",DEFAULT=NO,AUTOSELECT=NO
#EXT-X-MEDIA:TYPE=AUDIO,URI="_80/index.m3u8",GROUP-ID="2@48000-80000",NAME="AAC 80",DEFAULT=NO,AUTOSELECT=NO
#EXT-X-MEDIA:TYPE=AUDIO,URI="_96/index.m3u8",GROUP-ID="2@48000-96000",NAME="AAC 96",DEFAULT=NO,AUTOSELECT=NO
#EXT-X-STREAM-INF:BANDWIDTH=133336,CODECS="mp4a.40.2",AUDIO="2@48000-96000"
_96/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=100641,CODECS="mp4a.40.2",AUDIO="2@48000-64000"
_64/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=116989,CODECS="mp4a.40.2",AUDIO="2@48000-80000"
_80/index.m3u8
在苹果论坛上,我找到了this answer,上面说iOS 14+有错。不幸的是,我无法使用iOS 13物理设备进行测试。
你有什么建议吗?
在带有iPhone 7plus和iOS 15.0.2的Xcode 13.1上进行了测试。
发布于 2021-11-22 07:38:32
最后,我找到了这个问题的解决方案。对我来说起作用的是this。我认为问题在于我的清单文件的结构如下:
#EXT-X-MEDIA:TYPE=AUDIO,URI="_64/index.m3u8", GROUP-ID="1@48000-64000",NAME="Audio 64",DEFAULT=NO,AUTOSELECT=NO
特别是他们有DEFAULT=NO,AUTOSELECT=NO
。因此,在调用replaceCurrentItem
之前,我现在执行以下操作:
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
for characteristic in asset.availableMediaCharacteristicsWithMediaSelectionOptions {
if let group = asset.mediaSelectionGroup(forMediaCharacteristic: AVMediaCharacteristic.audible) {
if let option = group.options.first {
playerItem.select(option, in: group)
}
}
}
这使得我所有的HLS音频都可以通过AVPlayer播放。
发布于 2021-11-09 11:59:23
我在你的.m3u8中看不到版本。尝试将#EXT-X-VERSION:03添加到您的播放列表中。AVPlayer
确实需要在播放列表中包含版本(Android EXO播放器不需要它)。以下是可能有效播放列表的示例:
#EXTM3U
#EXT-X-VERSION:03
#EXT-X-MEDIA:TYPE=AUDIO,URI="_64/index.m3u8",GROUP-ID="2@48000-64000",NAME="AAC 64",DEFAULT=NO,AUTOSELECT=NO
#EXT-X-MEDIA:TYPE=AUDIO,URI="_80/index.m3u8",GROUP-ID="2@48000-80000",NAME="AAC 80",DEFAULT=NO,AUTOSELECT=NO
#EXT-X-MEDIA:TYPE=AUDIO,URI="_96/index.m3u8",GROUP-ID="2@48000-96000",NAME="AAC 96",DEFAULT=NO,AUTOSELECT=NO
#EXT-X-STREAM-INF:BANDWIDTH=133336,CODECS="mp4a.40.2",AUDIO="2@48000-96000"
_96/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=100641,CODECS="mp4a.40.2",AUDIO="2@48000-64000"
_64/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=116989,CODECS="mp4a.40.2",AUDIO="2@48000-80000"
_80/index.m3u8
https://stackoverflow.com/questions/69897413
复制相似问题