您需要考虑视频方向。这是一个 Swift 2 解决方案。它既可以裁剪视频又可以缩放视频
extension AVAsset {
private var g_naturalSize: CGSize {
return tracksWithMediaType(AVMediaTypeVideo).first?.naturalSize ?? .zero
}
var g_correctSize: CGSize {
return g_isPortrait ? CGSize(width: g_naturalSize.height, height: g_naturalSize.width) : g_naturalSize
}
var g_isPortrait: Bool {
let portraits: [UIInterfaceOrientation] = [.Portrait, .PortraitUpsideDown]
return portraits.contains(g_orientation)
// Same as UIImageOrientation
var g_orientation: UIInterfaceOrientation {
guard let transform = tracksWithMediaType(AVMediaTypeVideo).first?.preferredTransform else {
return .Portrait
}
switch (transform.tx, transform.ty) {
case (0, 0):
return .LandscapeRight
case (g_naturalSize.width, g_naturalSize.height):
return .LandscapeLeft
case (0, g_naturalSize.width):
return .PortraitUpsideDown
default:
return .Portrait
}
}
}
这里是如何获取转换
func transform(avAsset: AVAsset, scaleFactor: CGFloat) -> CGAffineTransform {
let offset: CGPoint
let angle: Double
switch avAsset.g_orientation {
case .LandscapeLeft:
offset = CGPoint(x: avAsset.g_correctSize.width, y: avAsset.g_correctSize.height)
angle = M_PI
case .LandscapeRight:
offset = CGPoint.zero
angle = 0
case .PortraitUpsideDown:
offset = CGPoint(x: 0, y: avAsset.g_correctSize.height)
angle = -M_PI_2
default:
offset = CGPoint(x: avAsset.g_correctSize.width, y: 0)
angle = M_PI_2
}
let scale = CGAffineTransformMakeScale(scaleFactor, scaleFactor)
let translation = CGAffineTransformTranslate(scale, offset.x, offset.y)
let rotation = CGAffineTransformRotate(translation, CGFloat(angle))
return rotation
}
以及如何在图层指令中使用
let layer = AVMutableVideoCompositionLayerInstruction(assetTrack: track)
layer.setTransform(transform(avAsset, scaleFactor: 0.8), atTime: kCMTimeZero)
参考