如何在 iOS 中将一个视频叠加在另一个视频上?

How to overlay one video on another in iOS?

我正在尝试将已拍摄的视频裁剪成 iOS 中的一个圆圈。我该怎么做。我知道如何使用 AVCaptureSession 来实现,但我不知道将已拍摄的视频作为 AVCaptureDevice 传递?有没有办法将视频裁剪成一个圆圈。我想将它叠加在另一个视频之上,因此它也必须具有透明背景。谢谢

我猜你想制作这样的东西:

您不需要 AVCaptureSession,因为您没有拍摄视频。你想要一个 AVMutableComposition。您需要阅读 “Editing” section of the AV Foundation Programming Guide。以下是您需要执行的操作的摘要:

  1. 为您的视频创建 AVAsset 对象并等待它们加载轨道。

  2. 创建 AVMutableComposition.

  3. 为每个输入视频的合成添加一个单独的 AVMutableCompositionTrack。确保为每个轨道分配明确的、不同的轨道 ID。如果您让系统选择,它将为每个使用轨道 ID 1,您稍后将无法在合成器中访问这两个轨道。

  4. 创建 AVMutableVideoComposition.

  5. 创建 AVMutableVideoCompositionInstruction.

  6. 对于每个输入视频,创建一个 AVMutableVideoCompositionLayerInstruction 并明确分配您在第 3 步中使用的轨道 ID。

  7. AVMutableVideoCompositionInstructionlayerInstructions 设置为您在第 6 步中创建的两层指令。

  8. AVMutableVideoCompositioninstructions 设置为您在步骤 5 中创建的指令。

  9. 创建一个实现 AVVideoCompositing 协议的 class。将视频合成(在第 4 步中创建)的 customVideoCompositorClass 设置为此自定义 class(例如 videoComposition.customVideoCompositorClass = [CustomVideoCompositor class];)。

  10. 在您的自定义合成器中,从 AVAsynchronousVideoCompositionRequest 获取输入像素缓冲区,并使用它们绘制合成帧(包含由前景视频的圆形块覆盖的背景视频帧框架)。您可以根据需要执行此操作。我使用 Core Graphics 做到了这一点,因为这很容易,但您可能希望使用 OpenGL(或者可能是 Metal)来提高生产应用程序的效率。如果您使用 OpenGL,请务必指定 kCVPixelBufferOpenGLESCompatibilityKey

  11. 使用第 1 步中的构图创建一个 AVAssetExportSession

  12. 设置会话的输出 URL 和文件类型。

  13. 将会话的 videoComposition 设置为步骤 4 中的视频合成。

  14. 将会话告诉 exportAsynchronouslyWithCompletionHandler:。估计会很慢!

你可以找到我的测试项目in this github repository