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

时间:2015-02-01 00:50:04

标签: ios avfoundation crop video-processing

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

1 个答案:

答案 0 :(得分:12)

我想你想要产生这样的东西:

demo of video overlay with oval crop

您不需要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. AVMutableVideoCompositionInstruction的{​​{1}}设置为您在步骤6中创建的两层说明。

  8. layerInstructions的{​​{1}}设置为您在步骤5中创建的说明。

  9. 创建一个实现AVMutableVideoComposition协议的类。将视频合成的instructions(在步骤4中创建)设置为此自定义类(例如AVVideoCompositing)。

  10. 在自定义合成器中,从customVideoCompositorClass获取输入像素缓冲区,并使用它们绘制合成帧(包含由前景视频帧的圆形块覆盖的背景视频帧)。你可以随心所欲地做到这一点。我使用Core Graphics做到了这一点很容易,但你可能想要在生产应用程序中使用OpenGL(或者Metal)来提高效率。如果使用OpenGL,请务必指定videoComposition.customVideoCompositorClass = [CustomVideoCompositor class];

  11. 使用步骤1中的作文创建AVAsynchronousVideoCompositionRequest

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

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

  14. 将会话告诉AVAssetExportSession。它可能会很慢!

  15. 您可以找到我的测试项目in this github repository