web-dev-qa-db-ja.com

AVPlayer内でHLSストリームのビデオサイズを取得するにはどうすればよいですか?

Hlsストリームを再生するときにビデオ解像度を取得しようとしています。私は典型的なプレイヤーの初期化を持っています:

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

KVOを使用していて、AVPlayerItemの.ReadyToPlayステータスを取得したときにビデオサイズを取得しようとしています。

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

}

問題は、tracksWithMediaType()が常に空の配列を返すことです(ただし、.movなどの非ストリームファイルでは機能します)。

AVPlayer内で再生されているHLSビデオのサイズ(CGRect)を取得するにはどうすればよいですか?

18
DixieFlatline

この方法を使用して、少なくともビデオ情報をログに記録できますか?

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)

...

}
12
tymac

HLSを使用すると、トラックは常にnilを返します。ビデオを再生するためにそのlayerClassをAVPlayerLayerでオーバーライドするUIViewサブクラスがある場合は、次のサイズを取得できます。

playerView.layer.videoRect

これは、レイヤー全体ではなく、ビデオのみのサイズです。

または、KVOを使用してアイテムのpresentationSizeを確認することもできます

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

プレーヤーのトラックに直接アクセスして、サイズを計算できます。

   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