我正在为我的一个应用构建视频导出功能。本质上,该视频是六个不同图像之一的系列,持续时间不同(短)。
当我导出包含 283 张不同持续时间图像的内容时,导出工作正常,但是当我尝试导出 803 张图像中的一张时,我得到了可怕的“操作无法完成”错误(又名“我们不知道只是什么爆炸是因为 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 header 的 Python 脚本找不到任何内容。它也不是像一些 OSStatus 错误那样的四字符代码(除非我搞砸了检查这个)。
我已经排除了我发现的“操作无法完成”错误的所有常见原因。它与文件系统权限或覆盖无关,appendPixelBuffer
的两次调用没有相同的呈现时间。
这与内存无关(视频导出期间内存使用率保持在 165MB),CPU 占用率接近 3%。
如果它有任何重要性,我会为 6 个图像一遍又一遍地重复使用相同的 6 个 CVPixelBuffer
,而不是每次都从 UIImage
创建新的。这似乎有助于提高性能,并且每次将其更改为新的似乎并没有改变任何东西(除了让它在第 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, NSUnderlyingError=0x17ab2050 {Error Domain=NSOSStatusErrorDomain Code=-16364 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-16364)}
使用 60 FPS 代替 30 FPS 可以防止这种特殊情况四舍五入为零持续时间,但一般的解决方案是丢弃持续时间四舍五入为零的帧。
关于ios - 使用 AVAssetWriter 时未知的底层 OSStatus 错误 -16364,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34424252/