如何从AVAsset或AVPlayerItem获取主清单中的所有HLS变体?

时间:2017-02-15 16:34:20

标签: ios avfoundation tvos hls

给定具有多个变体/再现的HLS清单:

#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,但同样,它只是正在播放的曲目而不是完整的变体列表。

我很想知道资产是否以最高质量播放,以便我可以决定用户是否有足够的带宽来启动同步的辅助视频流。

1 个答案:

答案 0 :(得分:0)

要知道您当前正在播放哪种变体,您可以在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请求并解析它。你只需要做一次,这样就不会有太大的开销。