如何在iOS中将video裁剪成圈?

我正在尝试在iOS中将已拍摄的video剪裁成圆形。 我该如何去做这件事。 我知道如何做AVCaptureSession,但我不知道作为一个AVCaptureDevice传递已经拍摄的video? 有没有办法将video剪裁成圆形。 我想叠加在另一个video的顶部,所以它也必须有一个透明的背景。 谢谢。

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

演示视频覆盖与椭圆形作物

你不需要一个AVCaptureSession ,因为你没有捕捉video。 你想要一个AVMutableComposition 。 您需要阅读AV Foundation编程指南的“编辑”部分 。 以下是您需要做的事情的总结:

  1. 为您的video创buildAVAsset对象并等待它们加载它们的曲目。

  2. 创build一个AVMutableComposition

  3. 为每个inputvideo的合成添加一个单独的AVMutableCompositionTrack 。 确保为每个音轨分配明确的不同音轨ID。 如果您select了系统,则会为每个系统使用曲目ID 1,而且以后在合成器中将无法访问。

  4. 创build一个AVMutableVideoComposition

  5. 创build一个AVMutableVideoCompositionInstruction

  6. 对于每个inputvideo,创build一个AVMutableVideoCompositionLayerInstruction并明确指定您在步骤3中使用的音轨ID。

  7. AVMutableVideoCompositionInstructionlayerInstructions设置为您在步骤6中创build的两个图层指令。

  8. AVMutableVideoCompositioninstructions设置为您在步骤5中创build的说明。

  9. 创build一个实现AVVideoCompositing协议的类。 将类对象设置为video组合的customVideoCompositorClass

  10. 在您的自定义合成器中,从AVAsynchronousVideoCompositionRequest获取input像素缓冲区,并使用它们绘制合成帧(包含由前景video帧的圆形块覆盖的背景video帧)。 你可以做到这一点,但你想要的。 我使用Core Graphics做了这个,因为这很容易,但是你可能会想在生产应用中使用OpenGL(或者Metal)来提高效率。 如果使用OpenGL,一定要指定kCVPixelBufferOpenGLESCompatibilityKey

  11. 使用步骤1中的作品创build一个AVAssetExportSession

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

  13. 将会话的videoComposition设置为步骤4中的video组合。

  14. 告诉会话exportAsynchronouslyWithCompletionHandler: 它可能会很慢!

你可以在这个github仓库中find我的testing项目。