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

7

如何在使用AVAssetWriter创建的视频中添加图像叠加层?

可以使用AVAssetExportSession实现,但本问题是关于如何使用AVAssetWriter实现这一目标,以便更好地控制质量和输出。

有两种场景:

1)简单:添加单个覆盖图像,该图像在整个视频持续时间内存在(类似于水印)。

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

1个回答

7

有很多不同的方法可以解决这个问题,正确的答案取决于您具体的使用情况。

从高层次来看,以下是三种方法:

  1. 你似乎已经熟悉了AVVideoCompositionCoreAnimationTool。你可以将其与AVAssetWriter一起使用。请查看https://github.com/rs/SDAVAssetExportSession,这是AVAssetExportSession的替代品,允许您传递所需的AVAssetWriter设置(因为它在内部使用AVAssetWriter)。
  2. 如果您想将类似于水印的内容合成到实时视频中(就像在此问题Simulate AVLayerVideoGravityResizeAspectFill: crop and center video to mimic preview without losing sharpness中一样),则可以通过AVCaptureVideoDataOutputSampleBufferDelegate传递给captureOutput函数的示例缓冲区来修改它。这里的典型方法是将CMSampleBuffer转换为CIImage,然后进行任何操作,最后将CIImage转换回CMSampleBuffer并将其写出。在链接的问题中,CMSampleBuffer只是简单地传递而没有进行任何操作。注意:从CIImage返回CMSampleBuffer的步骤相对较低级别,在StackOverflow上有很多示例,但Swift的示例不多。这里有一个实现(针对OSX)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/的类来实现自己的自定义合成器,并在AVVideoComposition中引用它。这很复杂,(可能)过度 - 如果您不知道为什么需要这样做,那么您可能不需要。如果您开始遇到问题,例如“我如何在视频的不同轨道上拥有多个动画层而不是全部在一个轨道上”或“我如何在图像框架内旋转,缩放和动画移动视频 - 就像极光胶片一样,在视频播放时旋转…”,那么这就是您需要研究的内容。
如果您需要更多信息,那么如果您对您要做的事情进行一些澄清,我可能能够扩展这个答案,以增加适当方法的更多细节。

没有技术上的原因,只是用户体验问题。如果您的应用程序仅生成视频,并且您只是进行后处理以添加水印,则在同一时间完成所有操作(使用#2)会提供更好的用户体验。如果您正在对用户录制的内容进行更复杂的后处理,则#1是一个不错的选择。 - Tim Bull
好的,谢谢...你的意思是说#2会比#1更快地生成视频,这样用户等待的时间就会更短? - Crashalot
没错,第二种是“实时”的或者对用户来说足够接近实时的,而第一种会有一个后处理时间,这个时间会比录制时间短,但仍然很重要。这实际上取决于你正在做什么,用户期望什么以及你如何呈现它。这不是一个技术问题,而是一个用户体验问题,它将帮助确定技术选择。 - Tim Bull
1
太棒了,这非常有帮助。由于它更容易且后处理对于一个用例来说很简单,我将首先尝试#1。不幸的是,似乎添加不同的多个叠加层(对于单个轨道)需要使用#3。祝你在Mixbit中好运。你的SO karma低了三个数量级;你应该得到更高的评价! - Crashalot
1
好的,很酷,再次感謝!不,只需要一個視頻軌道滿足兩種用例。因此使用AnimationTool不會影響質量?質量完全由AVAssetWriter中的設置所決定?此外,使用AVAssetExportSession將多個疊加層(而不是單個水印)動畫化到60秒用戶視頻需要大約10-20秒的時間。如果我們使用AVAssetWriter #1,性能是否會提高?還是我們需要使用#2的混合方案? - Crashalot
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接