2016-06-21 13 views
15

Ich versuche Videoauflösung zu bekommen, wenn ich hl-Stream abspiele. Ich habe typische Spieler init:Wie erhält man die Videogröße für den HLS-Stream im AVPlayer?

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

Ich benutze KVO und ich versuche, Video-Größe zu erhalten, wenn i .ReadyToPlay Status für AVPlayerItem erhalten:

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)") 

} 

Das Problem ist, dass tracksWithMediaType() immer leer zurück Array (funktioniert aber für Nicht-Stream-Dateien, zB für .mov).

Wie kann ich die Größe (CGRect) des HLS-Videos im AVPlayer abspielen?

+0

Was meinst du mit Größe? Die tatsächliche Auflösung des Videos oder das Rect der Player-Ebene? – JAL

+0

Videoauflösung, ja (die Frage wurde bearbeitet). – DixieFlatline

Antwort

7

Tracks werden immer Null zurückgeben, wenn HLS verwendet wird. Wenn Sie eine UIView-Unterklasse, die das Video seine layerClass mit einem AVPlayerLayer außer Kraft für das Spielen Sie die Größe mit

playerView.layer.videoRect 

bekommen Dies ist die Größe von nur Video und nicht die gesamte Schicht.

Alternativ können Sie KVO verwenden, um die presentationSize des Elements

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

Ich versuchte es mit KVO (presentationSize) vorher und es gab keine Videoauflösung zurück. – DixieFlatline

+2

Sie können player.currentItem.presentationSize Getter jederzeit verwenden, KVO dient nur der Bequemlichkeit. Dies wird Ihnen die Lösung geben. Ausgabe von diesem Befehl in einem periodischen Beobachter ist 'print (self?. MediaPlayer? .currentItem? .presentationSize)' -> 'Optional ((853.333312988281, 480.0)) ' – Max

+0

machte einen Kommentar, dass presentationSize nicht die native Größe war von dem Asset und dass es tatsächlich die Größe des Videos im Player war, aber das scheint nicht korrekt. In meiner App ist die Größe, die weiterhin ausgedruckt wird 1280x720, auch wenn Sie zwischen Querformat und Hochformat wechseln. Der vorherige Kommentar wurde entfernt, da dieser technisch falsch war. – FateNuller

7

zu beobachten sind Sie in der Lage zumindest das Video Info zur Anmeldung mit dieser Methode?

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

Der für tracksWithMediaType (AVMediaTypeVideo) auf einem m3u8-Asset zurückgegebene Wert ist ein leeres Array. Daher würde dieser Code zu einer Außer-Reihe-Ausnahme führen. – FateNuller