如何在AVPlayer中获取HLS流的视频大小?

时间:2016-06-21 11:20:13

标签: ios swift 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)?

3 个答案:

答案 0 :(得分:9)

使用HLS时,曲目将始终返回nil。如果你有一个UIView子类用AVPlayerLayer覆盖它的layerClass来播放视频你可以用

来获得大小
playerView.layer.videoRect

这只是视频的大小而不是整个图层。

或者,您可以使用KVO观察项目的presentationSize

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

答案 1 :(得分:9)

您是否能够使用此方法至少记录视频信息?

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 :(得分:0)

你可以简洁地这样做:

import AVKit

extension AVAsset {

    var videoSize: CGSize? {
        tracks(withMediaType: .video).first.flatMap {
            tracks.count > 0 ? $0.naturalSize.applying($0.preferredTransform) : nil
        }
    }
}