带有 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 中,您可以指定一种自定义方式来渲染来自源像素缓冲区的结果帧。 你可以参考这个答案: