AVAsset的NaturalSize与视频文件

时间:2016-06-30 12:34:40

标签: ios swift video avasset

检查视频方向时遇到很大问题。有一个代码可以检查视频文件是否处于纵向模式:

private func checkIfVideoIsPortrait(videoURL: NSURL) -> Bool {

    let videoAsset = AVAsset.init(URL: videoURL)
    let videoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
    let size = videoTrack.naturalSize
    let txf = videoTrack.preferredTransform

    let realSize = CGSizeApplyAffineTransform(size, txf)

    print(videoTrack)
    print(txf)
    print(size)
    print(realSize)

    if (size.width == txf.tx && size.height == txf.ty) {
        return false
    } else if (txf.tx == 0 && txf.ty == 0) {
        return false
    } else if (txf.tx == 0 && txf.ty == size.width) {
        return true
    } else {
        return true
    }
}

我有两个视频文件:1080x1920和360x640。关键是代码返回文件的不同维度,我无法识别视频方向。

有一个日志:

< AVAssetTrack:0x157dee9a0,trackID = 2,mediaType = vide>

CGAffineTransform(a:1.0,b:0.0,c:0.0,d:1.0,tx:0.0,ty:0.0)

(320.0,568.0)

(320.0,568.0)

< AVAssetTrack:0x1593643c0,trackID = 2,mediaType = vide>

CGAffineTransform(a:0.0,b:1.0,c:-1.0,d:0.0,tx:720.0,ty:0.0)

(1280.0,720.0)

( - 720.0,1280.0)

如何正确检查视频尺寸?我很乐意帮忙。

1 个答案:

答案 0 :(得分:2)

经过多天尝试和思考如何获得视频的真实自然大小后,我改变了我的策略。

现在我正在使用从视频创建的缩略图来检查电影的尺寸。

问题出在AVAssetExportSession中。它会破坏preferredTransform并使用格局值。原因可能隐藏在AVAssetExportPreset640x480中。

Swift 2.0中有一个解决方案代码:

func checkIfVideoIsPortrait(videoURL: NSURL) -> Bool {

    let videoAsset = AVAsset.init(URL: videoURL)

    let generator = AVAssetImageGenerator.init(asset: videoAsset)
    let imageRef: CGImageRef!

    do {
        try imageRef = generator.copyCGImageAtTime(kCMTimeZero, actualTime: nil)

        let thumbinal = UIImage.init(CGImage: imageRef)

        if thumbinal.size.width < thumbinal.size.height {
            return true
        } else if thumbinal.size.width > thumbinal.size.height{
            return false
        }

    } catch let error as NSError {
        print("Failed to check video portrait")
        print(error.localizedDescription)
    }
    return false
}