ios - 如何从 AVAsset 或 AVPlayerItem 获取主 list 中的所有 HLS 变体?

标签 ios avfoundation tvos http-live-streaming

给定一个包含多个变体/再现的 HLS list :

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1612430,CODECS="avc1.4d0020,mp4a.40.5",RESOLUTION=640x360
a.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3541136,CODECS="avc1.4d0020,mp4a.40.5",RESOLUTION=960x540
b.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=5086455,CODECS="avc1.640029,mp4a.40.5",RESOLUTION=1280x720
c.m3u8

是否可以从 AVAsset 或 AVPlayerItem 中获取三个变体的数组(具有带宽和分辨率等属性)?

我可以通过在 AVPlayerItem 上使用 KVO 来获取当前正在播放的 AVPlayerItemTrack,但同样,它只是正在播放的轨道,而不是完整的变体列表。

我很想知道 Assets 是否以尽可能高的质量播放,这样我就可以决定用户是否有足够的带宽来启动同步辅助视频流。

最佳答案

要了解您当前正在播放的变体,您可以在 AVPlayerItemNewAccessLogEntryNotification 上保留一个 KVO,并通过查看访问日志中的 AVPlayerItemAcessLogEvent,您可以了解当前比特率和比特率的任何变化。

AVPlayerItemAccessLog *accessLog = [((AVPlayerItem *)notif.object) accessLog];
AVPlayerItemAccessLogEvent *lastEvent = accessLog.events.lastObject;
if( lastEvent.indicatedBitrate != self.previousBitrate )
{
   self.bitrate = lastEvent.indicatedBitrate
}

就了解可用比特率的整个列表而言,您可以简单地为主 m3u8 播放列表发出 GET 请求并解析它。您只需要执行一次,因此开销不大。

关于ios - 如何从 AVAsset 或 AVPlayerItem 获取主 list 中的所有 HLS 变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42255041/

相关文章:

ios - 在 iOS Swift 中使用委托(delegate)和协议(protocol)从 dataTaskWithRequest 返回数据

ios - 无法使用 AVCapturePhotoOutput 捕捉照片 swift + xcode

iphone - 从 CMSampleBuffer 转换为 UIImage 对象

iphone - 使用 AVAssetReader 和 AVAssetWriter 将 *.mp3 与 *.mov 文件合并

ios - 如何在 tvOS 的 UICollectionView 中隐藏滚动指示器等内容

ios - 如何使用标签文本 (Int) 值编写 if 条件

objective-c - NSLayoutConstraints 和动态设置 View 的宽度/高度

swift - 如何使用 AVFoundation 制作视频填充框

UIWebView不可用: not available on tvOS

ios - 缺少 SCNAudioPlayer 的 audioNode 属性