2016-06-21 27 views
15

Sto cercando di ottenere la risoluzione video durante la riproduzione di streaming hls. devo tipico giocatore init:Come ottenere le dimensioni del video per lo streaming HLS all'interno di AVPlayer?

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

Io uso KVO e cerco di ottenere il video formato quando ottengo stato .ReadyToPlay per 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)") 

} 

Il problema è che tracksWithMediaType() restituisce sempre vuoto array (ma funziona con file non stream, ad es. per .mov).

Come posso ottenere la dimensione (CGRect) del video HLS riprodotto all'interno di AVPlayer?

+0

Cosa intendi per taglia? La risoluzione effettiva del video o il livello del livello del giocatore? – JAL

+0

Risoluzione video, sì (modifica la domanda). – DixieFlatline

risposta

7

Le tracce ritornano sempre nul quando si utilizza HLS. Se si dispone di una sottoclasse UIView che sostituisce la sua layerClass con un'AVPlayerLayer per la riproduzione del video è possibile ottenere la dimensione con

playerView.layer.videoRect 

Questa è la dimensione di appena il video e non l'intero livello.

In alternativa è possibile utilizzare KVO per osservare la presentationSize della voce

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

Ho provato prima con KVO (presentationSize) e non ha restituito la risoluzione video. – DixieFlatline

+2

È possibile utilizzare player.currentItem.presentationSize getter in qualsiasi momento, KVO è solo per comodità. Questo ti darà la risoluzione. L'output da questo comando in un osservatore periodico è 'print (self? .mediaPlayer? .currentItem? .presentationSize)' -> 'Opzionale ((853.333312988281, 480.0)) ' – Max

+0

Creato un commento che dice che presentationSize non era la dimensione nativa della risorsa e che in realtà era la dimensione del video nel player, ma ciò non sembra corretto. Nella mia app la dimensione che continua a essere stampata è 1280x720 anche quando si passa da orizzontale a verticale. Rimosso quel commento precedente poiché era tecnicamente scorretto. – FateNuller

7

Sei in grado di accedere almeno informazioni video utilizzando questo metodo?

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

Il valore restituito per tracksWithMediaType (AVMediaTypeVideo) su un asset m3u8 sarà un array vuoto, pertanto questo codice genererebbe un'eccezione di indice out of bounds. – FateNuller