如何使用 AVAssetWriter 向视频添加静态和动态叠加层?

How to add static and dynamic overlays to video with AVAssetWriter?

向使用 AVAssetWriter 创建的视频添加图像叠加层的正确方法是什么?

可以使用 AVAssetExportSession 做到这一点,但这个问题是关于如何使用 AVAssetWriter 做到这一点,以便更好地控制质量和输出。

有两种情况:

1) 简单:添加在整个视频持续时间内都存在的单个叠加层(类似于水印)。

2) 复杂:添加在不同时间动画进出视频的不同叠加层(类似于使用 AVVideoCompositionCoreAnimationTool)。

对此有很多不同的方法,正确的答案将取决于您的具体用例。

概括地说,这里有三种方法:

  1. 您似乎已经熟悉 AVVideoCompositionCoreAnimationTool。您可以将其与 AVAssetWriter 一起使用。查看 https://github.com/rs/SDAVAssetExportSession,它是 AVAssetExportSession 的替代品,允许您传递您正在寻找的 AVAssetWriter 设置(因为它在内部使用 AVAssetWriter)。
  2. 如果你想将水印之类的东西合成到实时视频中(就像这个问题) then you can actually modify the sample buffer which is passed to the captureOutput function by the AVCaptureVideoDataOutputSampleBufferDelegate. The typical approach here is convert the CMSampleBuffer to a CIImage and then do whatever manipulation you like, finally convert the CIImage BACK to a CMSampleBuffer and write it out. In the question linked, the CMSampleBuffer is simply passed on without any manipulation. NB The step from CIImage back to CMSampleBuffer is relatively low level, there are lots of examples on Whosebug however, although not many in Swift. Here's one implementation (for OSX however) Adding filters to video with AVFoundation (OSX) - how do I write the resulting image back to AVWriter?
  3. 根据您需要做的事情的复杂程度,您可以通过创建符合 https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVVideoCompositing_Protocol/ 的 class 并在 AVVideoComposition 中引用来实现您自己的自定义合成器。这很复杂并且(可能)矫枉过正 - 如果您不知道为什么需要这样做,那么您可能不需要一个。如果您开始为 "how can I have multiple animation layers on different tracks in my video and not all on one track" 或 "how can I rotate, scale and animate moving video within an image frame - like a polaroid that spins in while the video is playing in the frame" 之类的问题而苦苦挣扎...那么这就是您需要研究的内容。

如果您需要一些进一步的信息,然后如果您对您尝试做的事情添加一些说明,我可以扩展此答案以添加有关适当方法的更多详细信息。