我正在为我的某个应用构建视频导出功能.从本质上讲,视频是一系列六种不同图像中的一种,持续时间不同(短).
当我导出包含283个不同持续时间图像的东西时,导出工作正常,但是当我尝试导出803中的一个时,我得到了可怕的"操作无法完成"错误(AKA"我们不知道是什么爆炸因为AVFoundation错误报告很糟糕").
当我尝试使用my AVAssetWriterInputPixelBufferAdaptor
,return appendPixelBuffer:withPresentationTime:
返回第754帧(总是第754帧)时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
说没有这样的东西,这个用于搜索SDK标题的Python脚本什么也没发现.它也不是像一些OSStatus错误那样的四字符代码(除非我搞砸了这个).
我已经排除了我发现的"操作无法完成"错误的每个常见原因.它与文件系统权限或覆盖无关,没有两个调用appendPixelBuffer
具有相同的显示时间.
它不是内存(视频导出期间内存使用率保持在165MB),CPU保持在3%左右.
如果它具有任何重要性,我会对CVPixelBuffer
6个图像反复重复使用相同的6 秒,而不是UIImage
每次都从s 创建新的图像.这似乎有助于性能,并且每次都将其更改为新的并不会改变任何东西(除了让它在第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可以防止这种特殊情况四舍五入到零持续时间,但一般的解决方案是丢弃持续时间舍入为零的帧.