带有 ROTATED 矩形的 AVMutableVideoCompositionLayerInstruction setCropRectangle 无法按预期工作
AVMutableVideoCompositionLayerInstruction setCropRectangle with ROTATED rectangle not working as expected
我有一个放在屏幕原点的视频,没有旋转,如图所示
(忽略背景):
No crop rectangle
我使用 setCropRectangle 应用一个基本矩形(暂时没有旋转)裁剪,这样它将我的视频切成两半,并显示右侧,如您在此处看到的那样:
Crop Rectangle, no rotation
现在,我想将裁剪矩形旋转 45 度。我使用的测试代码看起来像这样。我只是在使用之前对我的裁剪矩形应用旋转变换。
let firstScale = CGFloat(0.8)
let FirstlayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: firstTrack!)
let Scale = CGAffineTransform(scaleX: firstScale, y: firstScale)
let Move = CGAffineTransform(translationX: 0, y: 0)
let Rotation = CGAffineTransform(rotationAngle: 0)
FirstlayerInstruction.setTransform(Scale.concatenating(Rotation).concatenating(Move), at: .zero)
let rectTransform = CGAffineTransform(rotationAngle: 45.degreesToRadians).concatenating(CGAffineTransform(translationX: firstTrack!.naturalSize.width/2, y: 0))
let rect = CGRect(x: 0, y: 0, width: firstTrack!.naturalSize.width/2, height: firstTrack!.naturalSize.height).applying(rectTransform)
FirstlayerInstruction.setCropRectangle(rect, at: .zero)
这只是一些测试数据。你可以看到我通过 45.degreesToRadians 作为裁剪矩形的旋转。
虽然我得到的结果不是我所期望的:
Actual Result + Expected Result
如您所见,裁剪矩形出于某种原因忽略了旋转并保持较大的方形,而不是菱形。这同样适用于任何旋转、负值、30、60 等。我用于旋转裁剪矩形的任何东西实际上都没有旋转。
Core Graphics API 是否仅限于此?我怎样才能达到预期的效果?
您不能指定裁剪角度。如果您想剪辑重叠视频,您必须创建自己的 class
实现 AVVideoCompositing
协议,并在您的 AVMutableVideoComposition
中将其指定为 customVideoCompositorClass
属性。在此 class 中,您可以指定一种自定义方式来渲染来自源像素缓冲区的结果帧。
你可以参考这个答案:
我有一个放在屏幕原点的视频,没有旋转,如图所示 (忽略背景):
No crop rectangle
我使用 setCropRectangle 应用一个基本矩形(暂时没有旋转)裁剪,这样它将我的视频切成两半,并显示右侧,如您在此处看到的那样:
Crop Rectangle, no rotation
现在,我想将裁剪矩形旋转 45 度。我使用的测试代码看起来像这样。我只是在使用之前对我的裁剪矩形应用旋转变换。
let firstScale = CGFloat(0.8)
let FirstlayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: firstTrack!)
let Scale = CGAffineTransform(scaleX: firstScale, y: firstScale)
let Move = CGAffineTransform(translationX: 0, y: 0)
let Rotation = CGAffineTransform(rotationAngle: 0)
FirstlayerInstruction.setTransform(Scale.concatenating(Rotation).concatenating(Move), at: .zero)
let rectTransform = CGAffineTransform(rotationAngle: 45.degreesToRadians).concatenating(CGAffineTransform(translationX: firstTrack!.naturalSize.width/2, y: 0))
let rect = CGRect(x: 0, y: 0, width: firstTrack!.naturalSize.width/2, height: firstTrack!.naturalSize.height).applying(rectTransform)
FirstlayerInstruction.setCropRectangle(rect, at: .zero)
这只是一些测试数据。你可以看到我通过 45.degreesToRadians 作为裁剪矩形的旋转。
虽然我得到的结果不是我所期望的:
Actual Result + Expected Result
如您所见,裁剪矩形出于某种原因忽略了旋转并保持较大的方形,而不是菱形。这同样适用于任何旋转、负值、30、60 等。我用于旋转裁剪矩形的任何东西实际上都没有旋转。
Core Graphics API 是否仅限于此?我怎样才能达到预期的效果?
您不能指定裁剪角度。如果您想剪辑重叠视频,您必须创建自己的 class
实现 AVVideoCompositing
协议,并在您的 AVMutableVideoComposition
中将其指定为 customVideoCompositorClass
属性。在此 class 中,您可以指定一种自定义方式来渲染来自源像素缓冲区的结果帧。
你可以参考这个答案: