我想在磁盘上读取一个视频资产,并对其进行一系列处理,比如在每个单独的帧上使用CICropFilter
并剪切一个掩码,将一个视频拆分为几个较小的视频,并从原始轨道中删除帧以"压缩"它,使其更像gif。
我想出了几个可能的途径:
AVAssetWriter
和AVAssetReader
在这种情况下,我将从文件中读取CMSampleBuffer
s,执行我想要的操作,然后使用AVAssetWriter
写回一个新文件。
AVMutableComposition
在这里,给定CMTimes
的列表,我可以很容易地剪切帧并重写视频,甚至为我想要创建的每个新视频创建多个构图,然后使用AVAssetExportSession
导出所有这些构图。
我关心的指标是:性能和功率。也就是说,我对这种方法感兴趣,这种方法在执行编辑时提供了最大的效率,同时也让我可以灵活地做我想做的事情。我想我所描述的视频编辑可以用这两种方法来完成,但实际上我想要最具性能/最好的功能。
根据我的经验,AVAssetExportSession的性能略高于使用AVAssetReader和AVAssetWriter进行直接的格式a->B类型转换,但也就是说,它可能还不够令人担忧。
根据苹果自己的文档https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40010188:
使用导出会话将现有资产重新编码为格式由少数常用预设之一定义。如果您需要在iOS 4.1及更高版本中,您可以使用同时使用资产读取器和资产写入器对象来转换资产从一种表示到另一种表示。使用这些对象,您可以例如,选择要在输出文件,指定自己的输出格式,或修改资源在转换过程中。
鉴于您问题的性质,您似乎还没有太多使用AVFoundation框架的经验。我的建议是从AVAssetExportSession开始,然后当遇到障碍时,深入到AVAssetReader和AVAssetWriter中。
最终,取决于你走了多远,你甚至可能想写自己的自定义合成器。