3

Я использую видео слияние учебника в том, что в ray wenderlich. Я всегда получаю видео с поворотом на 90 градусов. Когда я добавляю несколько кодов вращения кофеина, мое видео не видно. Можете ли вы мне сообщить, что я использую CGAffineTransformMakeRotation.Ориентация слияния видео в Swift

Мой код ниже

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 является фиксированной точкой, видео действительно перемещено.

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

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

Удачи вам!

Смежные вопросы