使用ScreenCaptureKit搭配AVAssetWriter导致文件损坏与报错
排查AVAssetWriter结合ScreenCaptureKit报错-12785的问题
错误码核心含义
你遇到的NSOSStatusErrorDomain Code=-12785对应kAVAssetWriterError_IncorrectInputFormat,本质是传入的CMSampleBuffer格式与AVAssetWriterInput预期格式不匹配,或是写入流程存在时序错误。
关键排查方向
1. 对比AVAssetWriterInput配置差异
重点核对两个仓库中AVAssetWriterInput的初始化参数:
- 视频编码设置字典里的
AVVideoCodecKey:确认是否使用ScreenCaptureKit支持的编码(如AVVideoCodecTypeH264或AVVideoCodecTypeHEVC) AVVideoPixelFormatKey:需与ScreenCaptureKit输出的CMSampleBuffer像素格式一致(可通过CMFormatDescriptionGetMediaSubType(CMSampleBufferGetFormatDescription(buffer))获取实际格式)AVVideoWidthKey和AVVideoHeightKey:必须匹配捕获的屏幕分辨率,避免缩放/拉伸导致格式不兼容
2. 检查写入流程的时序正确性
AVAssetWriter对调用顺序要求严格,必须遵循以下步骤:
- 初始化
AVAssetWriter并指定输出路径 - 创建
AVAssetWriterInput并添加到writer实例 - 调用
writer.startWriting() - 收到第一个
CMSampleBuffer时,调用writer.startSessionAtSourceTime(CMSampleBufferGetPresentationTimeStamp(buffer)) - 后续调用
input.append(buffer)写入数据
如果提前调用startSessionAtSourceTime(比如在收到buffer前),或打乱执行顺序,大概率会触发格式不匹配错误。
3. 验证CMSampleBuffer的有效性
- 打印每个
CMSampleBuffer的presentationTimeStamp,确保时间戳递增且时间基准与AVAssetWriter一致(ScreenCaptureKit的时间戳默认基于CMClockGetHostTimeClock(),无需额外转换) - 通过
CMSampleBufferIsValid(buffer)快速验证buffer是否包含有效数据,避免传入空或损坏的buffer
4. 权限与环境检查
- 确认项目已正确配置屏幕录制权限(在
Info.plist中添加NSScreenCaptureUsageDescription) - 检查输出文件路径是否有写入权限,避免因权限不足引发隐性格式错误
内容的提问来源于stack exchange,提问作者JonLuca
相关产品推荐
相关产品推荐

