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

Pau*_*l F 5 avfoundation http-live-streaming ios tvos

给定具有多个变体/再现的 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
Run Code Online (Sandbox Code Playgroud)

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

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

我有兴趣了解资产是否以尽可能高的质量播放,以便我可以决定用户是否有足够的带宽来启动同步辅助视频流。

小智 1

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

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

只要了解可用比特率的完整列表,您只需对主 m3u8 播放列表发出 GET 请求并解析它即可。您只需要执行一次,因此不会有太多开销。