我正在为我的某个应用构建视频导出功能。从本质上讲,视频是一系列六种不同图像中的一种,持续时间不同(短)。
当我导出包含283个不同持续时间的图像的东西时,导出工作正常,但是当我尝试导出803中的一个时,我得到了可怕的"操作无法完成"错误(A.K.A。"我们不知道是什么爆炸因为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 CVPixelBuffer
s,而不是每次都从UIImage
创建新的__init__
s。这似乎有助于提高性能,并且每次都不会将其改为新的状态似乎没有改变任何东西(除了让它在第753帧上失败),但是谁知道。
有谁知道这可能是什么?
答案 0 :(得分:17)
行。终于搞清楚了。
由于四舍五入(将小持续时间值舍入到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, NSUnderlyingError=0x17ab2050 {Error Domain=NSOSStatusErrorDomain Code=-16364 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-16364)}
使用60 FPS代替30 FPS可以防止这种特殊情况四舍五入到零持续时间,但一般解决方案是丢弃持续时间舍入为零的帧。