web-dev-qa-db-fra.com

Comment obtenir la taille de la vidéo pour le flux HLS dans AVPlayer?

J'essaie d'obtenir une résolution vidéo lors de la lecture de flux hls. J'ai un joueur typique init:

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

J'utilise KVO et j'essaie d'obtenir la taille de la vidéo lorsque j'obtiens le statut .ReadyToPlay pour 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)")

}

Le problème est que tracksWithMediaType () retourne toujours un tableau vide (mais fonctionne pour des fichiers non-stream, par exemple pour .mov).

Comment puis-je obtenir la taille (CGRect) de la vidéo HLS en cours de lecture dans AVPlayer?

17
DixieFlatline

Pouvez-vous enregistrer au moins les informations vidéo à l'aide de cette méthode?

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)

...

}
9
tymac

Les pistes reviendront toujours à zéro si vous utilisez HLS. Si vous avez une sous-classe UIView qui remplace sa layerClass par un AVPlayerLayer pour la lecture de la vidéo, vous pouvez obtenir la taille correspondante. 

playerView.layer.videoRect

C'est la taille de la vidéo et non celle de la couche entière.

Sinon, vous pouvez utiliser KVO pour observer la présentation Taille de l'élément

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

Vous pouvez accéder directement aux pistes du joueur, puis calculer la taille:

   let naturalSize = player?.currentItem?.tracks.first?.assetTrack?.naturalSize
   let preferredTransform = videoTrack.preferredTransform

   let realSize = CGSizeApplyAffineTransform(naturalSize!, preferredTransform)

   print("natural size \(naturalSize!)")
   print("real size \(realSize!)")
0
Denis Kreshikhin