Ориентация слияния видео в Swift

Я использую видео урок слияния в том, что в Ray Wenderlich. Я всегда получаю видео с поворотом на 90 градусов. Когда я добавляю несколько разных кодов вращения кофеина, мои видео не видны. Можете ли вы посоветовать мне код, который включает CGAffineTransformMakeRotation.

Мой код ниже

func orientationFromTransform(transform: CGAffineTransform) -> (orientation: UIImageOrientation, isPortrait: Bool) {
    var assetOrientation = UIImageOrientation.Up
    var isPortrait = false
    if transform.a == 0 && transform.b == 1.0 && transform.c == -1.0 && transform.d == 0 {
        assetOrientation = .Right
        isPortrait = true

    } else if transform.a == 0 && transform.b == -1.0 && transform.c == 1.0 && transform.d == 0 {
        assetOrientation = .Left
        isPortrait = true
    } else if transform.a == 1.0 && transform.b == 0 && transform.c == 0 && transform.d == 1.0 {
        assetOrientation = .Up

    } else if transform.a == -1.0 && transform.b == 0 && transform.c == 0 && transform.d == -1.0 {
        assetOrientation = .Down

    }
    return (assetOrientation, isPortrait)
}


func videoCompositionInstructionForTrack(track: AVCompositionTrack, asset: AVAsset) -> AVMutableVideoCompositionLayerInstruction {
    // 1
    let instruction = AVMutableVideoCompositionLayerInstruction(assetTrack: track)
    // 2
    let assetTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0] as! AVAssetTrack

    // 3
    var transform = assetTrack.preferredTransform
    let assetInfo = orientationFromTransform(transform)
    var scaleToFitRatio = UIScreen.mainScreen().bounds.width / assetTrack.naturalSize.width

    if assetInfo.isPortrait {
        // 4
        print("ppppp")
        scaleToFitRatio = UIScreen.mainScreen().bounds.width / assetTrack.naturalSize.height
        let scaleFactor = CGAffineTransformMakeScale(scaleToFitRatio, scaleToFitRatio)

        //instruction.setTransform(t2, atTime: kCMTimeZero)


        instruction.setTransform(CGAffineTransformConcat(assetTrack.preferredTransform, scaleFactor),
            atTime: kCMTimeZero)




    } else {
        // 5
        let scaleFactor = CGAffineTransformMakeScale(scaleToFitRatio, scaleToFitRatio)
        var concat = CGAffineTransformConcat(CGAffineTransformConcat(assetTrack.preferredTransform, scaleFactor), CGAffineTransformMakeTranslation(0, UIScreen.mainScreen().bounds.width / 2))
        if assetInfo.orientation == .Down {
            print("down")
            let fixUpsideDown = CGAffineTransformMakeRotation(CGFloat(M_PI))
            let windowBounds = UIScreen.mainScreen().bounds
            let yFix = assetTrack.naturalSize.height + windowBounds.height
            let centerFix = CGAffineTransformMakeTranslation(assetTrack.naturalSize.width, yFix)
            concat = CGAffineTransformConcat(CGAffineTransformConcat(fixUpsideDown, centerFix), scaleFactor)
        }
        instruction.setTransform(concat, atTime: kCMTimeZero)
    }

    return instruction
}

1 ответ

Решение

CGAffineTransformRotate работает вокруг точки.

Когда вы поворачиваете видео, оно "перемещается" вокруг этой точки, в том числе иногда за пределы экрана.

 x---    rotate 90 degrees clockwise around X becomes  -----x
 |   |                                                |     |
 |   |                                                 -----
 |   |
  ---  

Неплохая картинка, но вы можете видеть, что если x является фиксированной точкой, видео фактически перемещается.

В любом случае, это легко исправить - вам не хватает Translate (буквально перемещая положение видео в пределах выходного кадра).

Поэкспериментируйте с CGAffineTranslate (по масштабу видео), и вы увидите, что кадр перемещается.

Удачи!

Другие вопросы по тегам