我正在尝试将已拍摄的视频裁剪为iOS中的圆圈。我该怎么做呢?我知道如何使用AVCaptureSession进行此操作,但我不知道将已经拍摄的视频传递给AVCaptureDevice?有没有办法将视频裁剪成圆圈。我想将它叠加在另一个视频的顶部,因此它必须具有透明背景。感谢。
答案 0 :(得分:12)
我想你想要产生这样的东西:
您不需要AVCaptureSession
,因为您没有捕捉视频。你想要一个AVMutableComposition
。您需要阅读“Editing” section of the AV Foundation Programming Guide。以下是您需要做的总结:
为您的视频创建AVAsset
个对象,并等待他们加载他们的曲目。
创建AVMutableComposition
。
为每个输入视频的合成添加单独的AVMutableCompositionTrack
。确保为每个轨道分配明确的不同轨道ID。如果您让系统选择,它将为每个系统使用轨道ID 1,您将无法在合成器中稍后访问它们。
创建AVMutableVideoComposition
。
创建AVMutableVideoCompositionInstruction
。
对于每个输入视频,请创建AVMutableVideoCompositionLayerInstruction
并明确指定您在步骤3中使用的曲目ID。
将AVMutableVideoCompositionInstruction
的{{1}}设置为您在步骤6中创建的两层说明。
将layerInstructions
的{{1}}设置为您在步骤5中创建的说明。
创建一个实现AVMutableVideoComposition
协议的类。将视频合成的instructions
(在步骤4中创建)设置为此自定义类(例如AVVideoCompositing
)。
在自定义合成器中,从customVideoCompositorClass
获取输入像素缓冲区,并使用它们绘制合成帧(包含由前景视频帧的圆形块覆盖的背景视频帧)。你可以随心所欲地做到这一点。我使用Core Graphics做到了这一点很容易,但你可能想要在生产应用程序中使用OpenGL(或者Metal)来提高效率。如果使用OpenGL,请务必指定videoComposition.customVideoCompositorClass = [CustomVideoCompositor class];
。
使用步骤1中的作文创建AVAsynchronousVideoCompositionRequest
。
设置会话的输出URL和文件类型。
将会话的kCVPixelBufferOpenGLESCompatibilityKey
设置为步骤4中的视频合成。
将会话告诉AVAssetExportSession
。它可能会很慢!
您可以找到我的测试项目in this github repository。