gpt4 book ai didi

swift - Swift 中的视频合并方向

转载 作者:搜寻专家 更新时间:2023-10-31 23:00:53 24 4
gpt4 key购买 nike

我正在使用 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
}

最佳答案

CGAffineTransformRotate 围绕一个点运行。

当您旋转视频时,它会围绕该点“移动”,有时甚至会离开屏幕。

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

不是很好的图片,但你可以看到如果 x 是一个固定点,视频实际上已经移动了。

无论如何,这很容易修复 - 您缺少翻译(实际上是在输出帧内移动视频的位置)。

尝试使用 CGAffineTranslate(按视频的比例),您会看到帧四处移动。

祝你好运!

关于swift - Swift 中的视频合并方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35601094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com