当我导出包含283个不同持续时间的图像的东西时导出工作正常,但是当我尝试导出803中的一个时,我得到了可怕的“操作无法完成”错误(AKA“我们不知道是什么爆炸因为AVFoundation错误报告很糟糕“).
当我尝试使用我的AVAssetWriterInputPixelBufferAdaptor添加第754帧(总是第754帧)时,appendPixelBuffer:withPresentationTime:返回NO,AVAssetWriter的状态失败,其错误如下:
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedDescription=The operation could not be completed,NSUnderlyingError=0x17ab2050 {Error Domain=NSOSStatusErrorDomain Code=-16364 "(null)"},NSLocalizedFailureReason=An unknown error occurred (-16364)}
我不能为我的生活弄清楚底层错误(OSStatus -16364)是什么. www.osstatus.com不知道,macerror说没有这样的东西,this用于搜索SDK标题的Python脚本什么也没找到.它也不是像一些OSStatus错误那样的四字符代码(除非我搞砸了这个).
我已经排除了我发现的“操作无法完成”错误的每个常见原因.它与文件系统权限或覆盖无关,没有两个appendPixelBuffer调用具有相同的显示时间.
它不是内存(视频导出期间内存使用率保持在165MB),cpu保持在3%左右.
如果它具有任何重要性,我会反复为6个图像重复使用相同的6个CVPixelBuffers,而不是每次都从UIImages创建新的图像.这似乎有助于性能,并且每次都将其更改为新的并不会改变任何东西(除了让它在753帧上失败),但是谁知道.
有谁知道这可能是什么?
解决方法
由于舍入(将小持续时间值舍入到30 FPS的时间刻度,导致它们变为0/30),appendPixelBuffer:withPresentationTime:在特定情况下使用相同的presentationTime被调用两次. AVFoundation没有注意到问题,直到7帧之后才抛出错误:
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedDescription=The operation could not be completed,NSLocalizedFailureReason=An unknown error occurred (-16364)}
使用60 FPS代替30 FPS可以防止这种特殊情况从舍入到零持续时间,但一般的解决方案是丢弃持续时间舍入为零的帧.