2016-06-21 10 views
15

Próbuję uzyskać rozdzielczość wideo podczas odtwarzania strumienia hls. mam typowego odtwarzacza INIT:Jak uzyskać rozmiar wideo dla strumienia HLS wewnątrz AVPlayera?

let urlAsset = AVURLAsset(URL: currentVideoUrl) 
self.player=AVPlayer(playerItem: AVPlayerItem(asset:urlAsset)) 
....... 

używam KVO i staram się dostać rozmiar wideo, kiedy się stan .ReadyToPlay dla AVPlayerItem:

func resolutionSizeForVideo() { 

    guard let videoTrack = self.player.currentItem?.asset.tracksWithMediaType(AVMediaTypeVideo).first else 
    { return 
    } 

    let size = CGSizeApplyAffineTransform(videoTrack.naturalSize, videoTrack.preferredTransform) 
    let frameSize = CGSize(width: fabs(size.width), height: fabs(size.height)) 
    print ("video size: \(frameSize)") 

} 

Problemem jest to, że tracksWithMediaType() zawsze zwraca pusty array (ale działa dla plików innych niż strumień, np. dla .mov).

Jak mogę uzyskać rozmiar (CGRect) wideo HLS odtwarzanego w AVPlayer?

+0

Co masz na myśli pod względem wielkości? Rzeczywista rozdzielczość wideo lub warstwa odtwarzacza? – JAL

+0

Rozdzielczość wideo, tak (zredagowano pytanie). – DixieFlatline

Odpowiedz

7

Ścieżki zawsze zwracają zero podczas korzystania z HLS. Jeśli masz podklasy UIView, który zastępuje Jego layerClass z AVPlayerLayer do odtwarzania wideo można uzyskać rozmiaru z

playerView.layer.videoRect 

Jest to wielkość tylko filmem, a nie cała warstwa.

Alternatywnie można użyć KVO obserwować presentationSize elementu

player.addObserver(self, forKeyPath: "currentItem.presentationSize", options: [.Initial, .New], context: nil) 
+0

Próbowałem wcześniej z KVO (presentationSize) i nie zwracało rozdzielczości wideo. – DixieFlatline

+2

Możesz użyć player.currentItem.presentationSize getter w dowolnym momencie, KVO jest dla wygody. To da ci rozdzielczość. Wyjście z tego polecenia w okresowym obserwatorze to 'print (self? .mediaPlayer? .currentItem? .presentationSize)' -> 'Opcjonalnie ((853.333312988281, 480.0)) ' – Max

+0

Zgłosił komentarz mówiąc, że rozmiar prezentacji nie był rodzimym rozmiarem zasobu i faktycznie był to rozmiar filmu w odtwarzaczu, ale to nie wydaje się poprawne. W mojej aplikacji rozmiar, który nadal jest drukowany, wynosi 1280 x 720, nawet podczas przełączania między krajobrazem a portretem. Usunięto ten poprzedni komentarz, ponieważ był technicznie niepoprawny. – FateNuller

7

Czy jesteś w stanie zalogować przynajmniej info wideo przy użyciu tej metody?

func checkVideoRez(videoURL: NSURL) -> Bool { 

let videoAssetSource = AVAsset.init(URL: videoURL) 
let videoTrack = videoAssetSource.tracksWithMediaType(AVMediaTypeVideo)[0] 
let size = videoTrack.naturalSize 
let txf = videoTrack.preferredTransform 

let realVidSize = CGSizeApplyAffineTransform(size, txf) 

print(videoTrack) 
print(txf) 
print(size) 
print(realVidSize) 

... 

} 
+2

Wartość zwrócona dla tracksWithMediaType (AVMediaTypeVideo) dla zasobu m3u8 będzie pustą tablicą, więc kod ten spowoduje, że indeks zostanie poza wyjątkiem. – FateNuller

Powiązane problemy