我正在尝试合并多个视频。每个视频可以具有不同的尺寸,并且可以由用户改变所得的合成尺寸。这是我的函数,它为每个合并的视频创建一个指令。
func videoCompositionInstructionForTrack(assetTrack: AVCompositionTrack, videoSize: CGSize) -> AVMutableVideoCompositionLayerInstruction {
let instruction = AVMutableVideoCompositionLayerInstruction(assetTrack: assetTrack)
let transform = assetTrack.preferredTransform
let assetInfo = orientationFromTransform(transform: transform)
var scaleToFitRatio: CGFloat
var moveTransform: CGAffineTransform
if assetTrack.naturalSize.height/videoSize.height > assetTrack.naturalSize.width/videoSize.width {
scaleToFitRatio = videoSize.height / assetTrack.naturalSize.height
let xMoveFactor = (videoSize.width - assetTrack.naturalSize.width * scaleToFitRatio) / 2
moveTransform = CGAffineTransform(translationX: xMoveFactor, y: 0)
} else {
scaleToFitRatio = videoSize.width / assetTrack.naturalSize.width
let yMoveFactor = (videoSize.height - assetTrack.naturalSize.height * scaleToFitRatio) / 2
moveTransform = CGAffineTransform(translationX: 0, y: yMoveFactor)
}
let scaleFactor = CGAffineTransform(scaleX: scaleToFitRatio, y: scaleToFitRatio)
var concat = assetTrack.preferredTransform.concatenating(scaleFactor).concatenating(moveTransform)
if assetInfo.orientation == .down {
let fixUpsideDown = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
let yFix = assetTrack.naturalSize.height + videoSize.height
let centerFix = CGAffineTransform.init(translationX: assetTrack.naturalSize.width, y: yFix)
concat = fixUpsideDown.concatenating(centerFix).concatenating(scaleFactor).concatenating(moveTransform)
}
instruction.setTransform(concat, at: kCMTimeZero)
return instruction
}
我的问题是,在我生成的作品的边缘有时会出现额外的随机颜色线条。 image with lines 我已经看到一个答案说,其原因是所得到的成分的大小必须是16(或至少2)。 所以这就是我的问题。如何在应用矩阵后确保
let scaleFactor = CGAffineTransform(scaleX: scaleToFitRatio, y: scaleToFitRatio)
结果将是整数,还可以被任何整数划分?
很抱歉,如果我没有提供足够的信息,感谢每个人花时间尝试和帮助
答案 0 :(得分:0)
"有时"很可能当缩放视频的高度最终成为奇数个像素时,然后当中心精确地使边缘在半像素边界上时。在这种情况下,您只需要将视频的y原点放在一边,使其处于全像素边界。