ios - 如何在 iOS 中将一个视频叠加在另一个视频上?

标签 ios avfoundation crop video-processing

我正在尝试将已拍摄的视频裁剪成 iOS 中的一个圆圈。我该怎么做。我知道如何使用 AVCaptureSession 来实现,但我不知道将已拍摄的视频作为 AVCaptureDevice 传递?有没有办法将视频裁剪成一个圆圈。我想将它叠加在另一个视频之上,因此它也必须具有透明背景。谢谢。

最佳答案

我猜你想制作这样的东西:

demo of video overlay with oval crop

您不需要 AVCaptureSession,因为您没有捕获视频。您需要一个 AVMutableComposition。您需要阅读 “Editing” section of the AV Foundation Programming Guide .以下是您需要执行的操作的摘要:

  1. 为您的视频创建 AVAsset 对象并等待它们加载轨道。

  2. 创建一个AVMutableComposition

  3. 为每个输入视频的合成添加一个单独的 AVMutableCompositionTrack。确保为每个轨道分配明确的、不同的轨道 ID。如果您让系统选择,它将为每个轨道使用轨道 ID 1,您稍后将无法在合成器中访问这两个轨道。

  4. 创建一个AVMutableVideoComposition

  5. 创建一个AVMutableVideoCompositionInstruction

  6. 对于每个输入视频,创建一个 AVMutableVideoCompositionLayerInstruction 并明确分配您在第 3 步中使用的轨道 ID。

  7. AVMutableVideoCompositionInstructionlayerInstructions 设置为您在第 6 步中创建的两层指令。

  8. AVMutableVideoCompositioninstructions 设置为您在第 5 步中创建的指令。

  9. 创建一个实现AVVideoCompositing 协议(protocol)的类。将视频合成(在第 4 步中创建)的 customVideoCompositorClass 设置为此自定义类(例如 videoComposition.customVideoCompositorClass = [CustomVideoCompositor class];)。

    <
  10. 在您的自定义合成器中,从 AVAsynchronousVideoCompositionRequest 获取输入像素缓冲区,并使用它们绘制合成帧(包含由前景视频帧的圆形 block 覆盖的背景视频帧).您可以根据需要执行此操作。我使用 Core Graphics 做到了这一点,因为这很容易,但您可能希望使用 OpenGL(或者可能是 Metal)来提高生产应用程序的效率。如果您使用 OpenGL,请务必指定 kCVPixelBufferOpenGLESCompatibilityKey

  11. 使用第 1 步中的合成创建一个 AVAssetExportSession

  12. 设置 session 的输出 URL 和文件类型。

  13. 将 session 的 videoComposition 设置为第 4 步中的视频组合。

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

你可以找到我的测试项目in this github repository .

关于ios - 如何在 iOS 中将一个视频叠加在另一个视频上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28258270/

相关文章:

ios - CMSampleBufferRef 池写入 H.264 AVCC 流

iphone - 有人能给我一些 AVFoundation 示例源代码吗?

android - 在不移动叠加 View 的情况下裁剪和缩放图像,而不是在 ImageView 中移动图像

java - 从Java开始在OSX(AVFoundation)上的ffmpeg屏幕截图问题

ios - UIDatePicker选择的日期不出现

iOS Swift YouTube 数据 API v3 集成崩溃应用程序

iphone - MKMapKit 关注用户

android - react 原生 : Crop image on Android

css - 裁剪图库的缩略图

ios - 在 iOS 上使用 VoiceOver 时如何获取当前聚焦的元素?