在AVMutableVideoCompositionLayerInstruction中调整视频大小

时间:2017-12-01 11:25:29

标签: ios video avfoundation

我正在尝试合并多个视频。每个视频可以具有不同的尺寸,并且可以由用户改变所得的合成尺寸。这是我的函数,它为每个合并的视频创建一个指令。

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)

结果将是整数,还可以被任何整数划分?

很抱歉,如果我没有提供足够的信息,感谢每个人花时间尝试和帮助

1 个答案:

答案 0 :(得分:0)

"有时"很可能当缩放视频的高度最终成为奇数个像素时,然后当中心精确地使边缘在半像素边界上时。在这种情况下,您只需要将视频的y原点放在一边,使其处于全像素边界。