2017-02-15 21 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のいずれかから(例えば、帯域幅や解像度などの属性を持つ)3つのバリアントの配列を取得することは可能ですか?

AVPlayerItemでKVOを使用して現在再生中のAVPlayerItemTrackを取得することができますが、やはりバリエーションの完全なリストではなく、実際に再生されているトラックのみです。

アセットが最高品質で再生されているかどうかを知ることに興味があり、ユーザーが同時にセカンダリビデオストリームを開始するのに十分な帯域幅を持っているかどうかを判断できます。

+0

あなたは 'AVAsset.trackGroups'プロパティをチェックしましたか?ドキュメントから、マッチするかもしれないように聞こえます。 –

+0

@DaveWestonさて、トラックとトラックグループの両方をチェックしようとしましたが、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リクエストを作成し、それを解析することができます。あなたはそれを一度だけ行う必要があるのでオーバーヘッドはあまりありません。