AVAsset 的 NaturalSize 与视频文件不同

Posted

技术标签:

【中文标题】AVAsset 的 NaturalSize 与视频文件不同【英文标题】:NaturalSize of AVAsset is different than video file 【发布时间】:2016-06-30 12:34:40 【问题描述】:

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

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。关键是代码返回文件的不同尺寸,我无法识别视频方向。

有一个日志:

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)

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】:

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

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

问题出在 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

【讨论】:

以上是关于AVAsset 的 NaturalSize 与视频文件不同的主要内容,如果未能解决你的问题,请参考以下文章

将AVAsset视频文件拆分为块

为啥 AVAsset 轨道对于同一个视频文件有不同的 timeRange?

将 AVAsset 读入帧并编译回视频

使用 AVAsset/AVCaptureSession 裁剪视频

AVAsset 在 iOS 中使用图像叠加保存视频会破坏视频

使用 AVAsset 的多个图像到视频需要高内存