2017-02-15 5 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 그래, 나는 트랙과 트랙 그룹을 모두 검사 해봤지만'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 요청을하고이를 분석 할 수 있습니다. 한 번만 수행하면되므로 많은 오버 헤드가 발생하지 않습니다.