如何在iOS中将video裁剪成圈?
我正在尝试在iOS中将已拍摄的video剪裁成圆形。 我该如何去做这件事。 我知道如何做AVCaptureSession,但我不知道作为一个AVCaptureDevice传递已经拍摄的video? 有没有办法将video剪裁成圆形。 我想叠加在另一个video的顶部,所以它也必须有一个透明的背景。 谢谢。
我想你想要产生这样的东西:
你不需要一个AVCaptureSession
,因为你没有捕捉video。 你想要一个AVMutableComposition
。 您需要阅读AV Foundation编程指南的“编辑”部分 。 以下是您需要做的事情的总结:
-
为您的video创build
AVAsset
对象并等待它们加载它们的曲目。 -
创build一个
AVMutableComposition
。 -
为每个inputvideo的合成添加一个单独的
AVMutableCompositionTrack
。 确保为每个音轨分配明确的不同音轨ID。 如果您select了系统,则会为每个系统使用曲目ID 1,而且以后在合成器中将无法访问。 -
创build一个
AVMutableVideoComposition
。 -
创build一个
AVMutableVideoCompositionInstruction
。 -
对于每个inputvideo,创build一个
AVMutableVideoCompositionLayerInstruction
并明确指定您在步骤3中使用的音轨ID。 -
将
AVMutableVideoCompositionInstruction
的layerInstructions
设置为您在步骤6中创build的两个图层指令。 -
将
AVMutableVideoComposition
的instructions
设置为您在步骤5中创build的说明。 -
创build一个实现
AVVideoCompositing
协议的类。 将类对象设置为video组合的customVideoCompositorClass
。 -
在您的自定义合成器中,从
AVAsynchronousVideoCompositionRequest
获取input像素缓冲区,并使用它们绘制合成帧(包含由前景video帧的圆形块覆盖的背景video帧)。 你可以做到这一点,但你想要的。 我使用Core Graphics做了这个,因为这很容易,但是你可能会想在生产应用中使用OpenGL(或者Metal)来提高效率。 如果使用OpenGL,一定要指定kCVPixelBufferOpenGLESCompatibilityKey
。 -
使用步骤1中的作品创build一个
AVAssetExportSession
。 -
设置会话的输出URL和文件types。
-
将会话的
videoComposition
设置为步骤4中的video组合。 -
告诉会话
exportAsynchronouslyWithCompletionHandler:
它可能会很慢!
你可以在这个github仓库中find我的testing项目。