检查视频方向时遇到很大问题。有一个代码可以检查视频文件是否处于纵向模式:
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)
如何正确检查视频尺寸?我很乐意帮忙。
答案 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
}