在我的iOS应用程序的用户界面中,我展示了一个复杂的
现在我想将这个图层组合导出到一个视频文件中。在
然而,这两个工具不能同时使用:如果我启动一个合并这些工具的
2. 从资产读取器中获取样本缓冲区并应用
3. 将
4. 使用
5. 使用
此设置可以工作,但速度极慢-导出5秒的视频有时需要一分钟。这里的瓶颈似乎是
CALayer
层次结构。其中之一是一个AVPlayerLayer
,它在实时应用CIFilter
(使用 AVVideoComposition(asset:,applyingCIFiltersWithHandler:)
),显示一个视频。现在我想将这个图层组合导出到一个视频文件中。在
AVFoundation
中有两个工具似乎很有用:
A:AVVideoCompositionCoreAnimationTool
,可以在(可能是动画的)CALayer
层次结构内呈现视频
B:我在UI中也使用它,将CIFilter
应用于视频资源的AVVideoComposition(asset:,applyingCIFiltersWithHandler:)
。然而,这两个工具不能同时使用:如果我启动一个合并这些工具的
AVAssetExportSession
,AVFoundation
会抛出NSInvalidArgumentException
:
Expecting video composition to contain only AVCoreImageFilterVideoCompositionInstruction
AVAssetReader
和AVAssetWriter
设置导出2. 从资产读取器中获取样本缓冲区并应用
CIFilter
,将结果保存在CGImage
中。3. 将
CGImage
设置为层次结构中视频层的content
。现在,图层层次结构“看起来像”最终视频的一帧。4. 使用
CVPixelBufferGetBaseAddress
从资产编写器获取每个帧的CVPixelBuffer
数据,并使用该数据创建一个CGContext
。5. 使用
CALayer.render(in ctx: CGContext)
渲染我的层到该上下文中。此设置可以工作,但速度极慢-导出5秒的视频有时需要一分钟。这里的瓶颈似乎是
CoreGraphics
调用(我想这是因为使用这种方法在CPU上进行合成?)
解决方法2
另一种方法可能是分两步进行:首先,像B中一样仅保存应用了滤镜的源视频文件,然后像A一样使用该视频文件将视频嵌入层组合中。但是,由于要进行两次处理,所以我认为这不太有效率。
总结
如何以最佳方式将此视频导出到文件中,最好一次性完成? 如何同时使用 CIFilter
和 AVVideoCompositionCoreAnimationTool
? 是否有一种本地的方法可以在 AVFoundation
中设置“管道”,以组合这些工具?