2017-02-15 20 views
2

給定一個HLS清單與多個變種/演繹:如何從AVAsset或AVPlayerItem獲取主清單中的所有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,但同樣,它只是正在播放的曲目而不是完整的變體列表。

我很想知道資產是否以最高質量播放,以便我可以決定用戶是否有足夠的帶寬來啓動同時發送的輔助視頻流。

+0

你是否檢查過AVAsset.trackGroups屬性?從文檔中可以看出它可能會匹配。 –

+0

@DaveWeston Yup,我試着檢查軌道和trackGroups,但它們總是以空數組的形式返回,即使使用'loadValuesAsynchronously':/ –

回答

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請求並解析它。你只需要做一次,所以沒有太多的開銷。

相關問題