2017-12-01 3 views
0

複数のビデオを1つにマージしようとしています。すべての動画は異なるサイズを持ち、結果のコンポジションサイズはユーザーによって変更される可能性があります。ここでは、マージされる各ビデオの指示を作成する私の関数です。AVMutableVideoCompositionLayerInstructionのビデオのサイズ変更

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 
} 

私の問題は、ランダムな色の余分な線が、結果として生じる組成物の端に時々現れることです。 私は、結果の構成のサイズが16(または少なくとも2)で見えるようにする必要があるという理由を説明しました。 ここに私の質問に行く。どのように私はその結果が何によっても、整数、さらに割り切れるだろう

let scaleFactor = CGAffineTransform(scaleX: scaleToFitRatio, y: scaleToFitRatio)

行列を適用した後に確認することができますか?誰もが試してみて、助けるために時間を割いてまで

私は十分な情報を提供しなかった場合は申し訳ありませんが、感謝

答えて

0

スケール映像の高さが、その後のピクセル数が奇数、と終わるとき、「時々」可能性があります中央に置かれると、ハーフピクセル境界上のエッジが正確に作られます。その場合、ビデオのy原点をフロアするだけでフルピクセルの境界にくるようにするだけです。

+0

ありがとうございました。うまくいきました。私はビデオの問題の位置づけを理解していませんでした。 – f3dm76

関連する問題