我正在尝试将已拍摄的视频裁剪成 iOS 中的一个圆圈。我该怎么做。我知道如何使用 AVCaptureSession 来实现,但我不知道将已拍摄的视频作为 AVCaptureDevice 传递?有没有办法将视频裁剪成一个圆圈。我想将它叠加在另一个视频之上,因此它也必须具有透明背景。谢谢。
最佳答案
我猜你想制作这样的东西:
您不需要 AVCaptureSession
,因为您没有捕获视频。您需要一个 AVMutableComposition
。您需要阅读 “Editing” section of the AV Foundation Programming Guide .以下是您需要执行的操作的摘要:
为您的视频创建
AVAsset
对象并等待它们加载轨道。创建一个
AVMutableComposition
。为每个输入视频的合成添加一个单独的
AVMutableCompositionTrack
。确保为每个轨道分配明确的、不同的轨道 ID。如果您让系统选择,它将为每个轨道使用轨道 ID 1,您稍后将无法在合成器中访问这两个轨道。创建一个
AVMutableVideoComposition
。创建一个
AVMutableVideoCompositionInstruction
。对于每个输入视频,创建一个
AVMutableVideoCompositionLayerInstruction
并明确分配您在第 3 步中使用的轨道 ID。将
AVMutableVideoCompositionInstruction
的layerInstructions
设置为您在第 6 步中创建的两层指令。将
AVMutableVideoComposition
的instructions
设置为您在第 5 步中创建的指令。创建一个实现
<AVVideoCompositing
协议(protocol)的类。将视频合成(在第 4 步中创建)的customVideoCompositorClass
设置为此自定义类(例如videoComposition.customVideoCompositorClass = [CustomVideoCompositor class];
)。在您的自定义合成器中,从
AVAsynchronousVideoCompositionRequest
获取输入像素缓冲区,并使用它们绘制合成帧(包含由前景视频帧的圆形 block 覆盖的背景视频帧).您可以根据需要执行此操作。我使用 Core Graphics 做到了这一点,因为这很容易,但您可能希望使用 OpenGL(或者可能是 Metal)来提高生产应用程序的效率。如果您使用 OpenGL,请务必指定kCVPixelBufferOpenGLESCompatibilityKey
。使用第 1 步中的合成创建一个
AVAssetExportSession
。设置 session 的输出 URL 和文件类型。
将 session 的
videoComposition
设置为第 4 步中的视频组合。告诉 session
exportAsynchronouslyWithCompletionHandler:
。它可能会很慢!
你可以找到我的测试项目in this github repository .
关于ios - 如何在 iOS 中将一个视频叠加在另一个视频上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28258270/