Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理视频和写入文件的最有效方法-ios AVFoundation_Ios_Swift_Avfoundation_Avasset - Fatal编程技术网

处理视频和写入文件的最有效方法-ios AVFoundation

处理视频和写入文件的最有效方法-ios AVFoundation,ios,swift,avfoundation,avasset,Ios,Swift,Avfoundation,Avasset,我想读入磁盘上的视频资源和一系列处理,比如在每一帧上使用CICropFilter,剪下一个遮罩,将一个视频分割成几个较小的视频,并从原始曲目中删除帧以“压缩”它,使它更像gif 我想出了一些可能的途径: AVAssetWriter和avassetrader 在这种情况下,我将从文件中读取CMSampleBuffers,执行所需的操作,然后使用AVAssetWriter写回新文件 AVMutableComposition 在这里,给定一个CMTimes列表,我可以轻松地剪切帧并重写视频,甚至为我想

我想读入磁盘上的视频资源和一系列处理,比如在每一帧上使用
CICropFilter
,剪下一个遮罩,将一个视频分割成几个较小的视频,并从原始曲目中删除帧以“压缩”它,使它更像gif

我想出了一些可能的途径:

  • AVAssetWriter
    avassetrader
  • 在这种情况下,我将从文件中读取
    CMSampleBuffer
    s,执行所需的操作,然后使用
    AVAssetWriter
    写回新文件

  • AVMutableComposition
  • 在这里,给定一个
    CMTimes
    列表,我可以轻松地剪切帧并重写视频,甚至为我想要创建的每个新视频创建多个合成,然后使用
    AVAssetExportSession
    导出所有合成


    我关心的指标是:性能和功率。也就是说,我对在执行编辑时提供最高效率的方法感兴趣,同时也能让我灵活地做我想做的事情。我想我所描述的视频编辑可以用这两种方法来完成,但我真的想要性能最好/功能最好的

    根据我的经验,AVAssetExportSession的性能比使用AVAssetReader和AVAssetWriter进行直接的格式a->格式B类型转换稍微好一点,尽管如此,它可能还不足以引起太多的关注

    根据苹果公司自己的文件:

    使用导出会话将现有资源重新编码为格式 由少量常用预设之一定义。如果你需要 在iOS 4.1及更高版本中,您可以使用 资产读取器和资产写入器对象串联以转换资产 从一个代表到另一个代表。使用这些对象,您可以 例如,选择要在中表示的轨迹 输出文件,指定自己的输出格式,或修改资源 在转换过程中

    鉴于问题的性质,您似乎还没有太多的AVFoundation框架经验。我的建议是先从AVAssetExportSession开始,然后当你遇到路障时,再深入到AVAssetReader和AVAssetWriter


    最终,取决于你做了多远,你甚至可能想要编写自己的自定义合成器。

    实际上,我确实有很多经验,至少使用了AVFoundation的上层,而不是像自定义合成器这样的东西。如果我想读入一个电影文件并删除所有人脸检测失败的样本缓冲区(使用
    CIDetector
    ),然后将这些缓冲区写入一个新文件(带有调整后的时间戳),您建议我使用@Tim Bull做什么?是一个编剧还是一个自定义排字器?它不是一个非此即彼的或。从AVAssetWriter开始,如果您需要自定义合成器,那么您可以实现它。基本上,如果您只是在视频帧上进行CIFILTER,那么AVAssetWriter就可以了。如果您开始关注如何以有趣的方式同时组合轨迹A和轨迹B中的帧,那么您将开始使用自定义合成器。具体回答你的问题-就你所说的,AVAssetWrite应该没问题。嗯,是的,似乎是这样。有没有关于如何制作自定义合成器的好资源?我一直在找,但找不到,这似乎是我想去的方向。我想你把两者混淆了。AVAssetWriter负责将渲染缓冲区写入磁盘。AVVideoCompositingProtocol由自定义合成器实现,允许您在将曲目渲染到缓冲区之前访问曲目,并精确控制曲目的组合方式。没有CustomCompositor,您可以操作TrackA和TrackB组合的结果输出(使用它做您想做的事情),但是使用CustomCompositor,您可以控制它们组合的方式。