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?
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)
...
}
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)
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!)")