如何在 iOS 中将一个视频叠加在另一个视频上?
How to overlay one video on another in iOS?
我正在尝试将已拍摄的视频裁剪成 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
协议的 class。将视频合成(在第 4 步中创建)的 customVideoCompositorClass
设置为此自定义 class(例如 videoComposition.customVideoCompositorClass = [CustomVideoCompositor class];
)。
在您的自定义合成器中,从 AVAsynchronousVideoCompositionRequest
获取输入像素缓冲区,并使用它们绘制合成帧(包含由前景视频的圆形块覆盖的背景视频帧框架)。您可以根据需要执行此操作。我使用 Core Graphics 做到了这一点,因为这很容易,但您可能希望使用 OpenGL(或者可能是 Metal)来提高生产应用程序的效率。如果您使用 OpenGL,请务必指定 kCVPixelBufferOpenGLESCompatibilityKey
。
使用第 1 步中的构图创建一个 AVAssetExportSession
。
设置会话的输出 URL 和文件类型。
将会话的 videoComposition
设置为步骤 4 中的视频合成。
将会话告诉 exportAsynchronouslyWithCompletionHandler:
。估计会很慢!
你可以找到我的测试项目in this github repository。
我正在尝试将已拍摄的视频裁剪成 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
协议的 class。将视频合成(在第 4 步中创建)的customVideoCompositorClass
设置为此自定义 class(例如videoComposition.customVideoCompositorClass = [CustomVideoCompositor class];
)。在您的自定义合成器中,从
AVAsynchronousVideoCompositionRequest
获取输入像素缓冲区,并使用它们绘制合成帧(包含由前景视频的圆形块覆盖的背景视频帧框架)。您可以根据需要执行此操作。我使用 Core Graphics 做到了这一点,因为这很容易,但您可能希望使用 OpenGL(或者可能是 Metal)来提高生产应用程序的效率。如果您使用 OpenGL,请务必指定kCVPixelBufferOpenGLESCompatibilityKey
。使用第 1 步中的构图创建一个
AVAssetExportSession
。设置会话的输出 URL 和文件类型。
将会话的
videoComposition
设置为步骤 4 中的视频合成。将会话告诉
exportAsynchronouslyWithCompletionHandler:
。估计会很慢!
你可以找到我的测试项目in this github repository。