You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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对调用顺序要求严格,必须遵循以下步骤:

  1. 初始化AVAssetWriter并指定输出路径
  2. 创建AVAssetWriterInput并添加到writer实例
  3. 调用writer.startWriting()
  4. 收到第一个CMSampleBuffer时,调用writer.startSessionAtSourceTime(CMSampleBufferGetPresentationTimeStamp(buffer))
  5. 后续调用input.append(buffer)写入数据
    如果提前调用startSessionAtSourceTime(比如在收到buffer前),或打乱执行顺序,大概率会触发格式不匹配错误。

3. 验证CMSampleBuffer的有效性

  • 打印每个CMSampleBuffer的presentationTimeStamp,确保时间戳递增且时间基准与AVAssetWriter一致(ScreenCaptureKit的时间戳默认基于CMClockGetHostTimeClock(),无需额外转换)
  • 通过CMSampleBufferIsValid(buffer)快速验证buffer是否包含有效数据,避免传入空或损坏的buffer

4. 权限与环境检查

  • 确认项目已正确配置屏幕录制权限(在Info.plist中添加NSScreenCaptureUsageDescription)
  • 检查输出文件路径是否有写入权限,避免因权限不足引发隐性格式错误

内容的提问来源于stack exchange,提问作者JonLuca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:55:17