如何使用AVAssetWriter将静态和dynamic叠加添加到video?
什么是正确的方式来添加一个图像叠加到AVAssetWriter创build的video?
有可能用AVAssetExportSession这样做,但是这个问题是关于如何用AVAssetWriter这样做的,所以对质量和输出有更多的控制。
有两种情况:
1)简单:在video的整个持续时间内添加单个叠加(类似于水印)。
2)复杂:添加不同的覆盖,在不同的时间进出video(类似于使用AVVideoCompositionCoreAnimationTool)。
有很多不同的方法,正确的答案将取决于你的用例是什么。
高层次,这里有三种方法:
- 您似乎已经熟悉AVVideoCompositionCoreAnimationTool。 你可以在AVAssetWriter中使用它。 查看https://github.com/rs/SDAVAssetExportSession这是一个替代AVAssetExportSession,允许您传递您正在寻找的AVAssetWriter设置(因为它在内部使用AVAssetWriter)的下降。
- 如果你想像水印一样的东西组合到现场video中(就像在这个问题中一样) 模拟AVLayerVideoGravityResizeAspectFill:裁剪和中心video模仿预览,而不会失去清晰度 ),那么你实际上可以修改AVCaptureVideoDataOutputSampleBufferDelegate传递给captureOutput函数的采样缓冲区。 这里的典型方法是将CMSampleBuffer转换为CIImage,然后做任何你喜欢的操作,最后把CIImage BACK转换成一个CMSampleBuffer并写出来。 在链接的问题,CMSampleBuffer只是简单地传递,没有任何操纵。 NB从CIImage到CMSampleBuffer的步骤相对较低,但是在StackOverflow上有很多例子,尽pipe在Swift中并不多。 这里有一个实现(对OSX来说)然后用AVFoundation(OSX ) 添加filter到video – 我怎么把结果图像写回AVWriter?
- 具体取决于你需要做的是多么复杂,你可以通过创build一个符合https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVVideoCompositing_Protocol/的类实现自己的自定义合成器并在AVVideoComposition中引用。 这是复杂的(可能)矫枉过正 – 如果你不知道为什么你需要这样做,那么你可能不需要一个 。 如果您开始努力解决“我怎么能在video中的不同轨道上有多个animation层,而不是全部在一个轨道上”,或者“我怎样在图像帧内旋转,缩放和animation移动video – 就像旋转的宝丽来在video在框架中播放“…这是你需要看的东西。
如果你需要更多的信息,那么如果你对你要做的事情做一些澄清,我可以扩展这个答案,在适当的方法上增加更多的细节。
- 为什么AVFoundation不能在iOS设备上接受我的平面像素缓冲区?
- 更改AVCaptureDeviceInput导致AVAssetWriterStatusFailed
- 问题与设置和检索AVMetadataCommonKeyCreator的价值
- AVAssetWriter可以使用透明度编写文件吗?
- AVAssetWritter不适用于audio
- 通过AVMutableVideoComposition和CAAnimation输出黑色video
- 将video+生成的audio写入AVAssetWriterInput,audio口吃
- AVAssetWriterInputPixelBufferAdaptor和CMTime
- AVAssetWriter如何写下采样/压缩m4a / mp3文件