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

MacOS跨平台录屏开发出现swscaler bad src image pointers错误如何解决

问题原因

你遇到的问题核心是没有对FFmpeg编解码接口的返回值做合法性判断,直接使用未成功解码的帧数据导致的:

  • FFmpeg的avcodec_send_packet和avcodec_receive_frame是异步接口,单次调用send_packet后不一定能马上通过receive_frame拿到有效帧,接口会返回AVERROR(EAGAIN)提示需要继续输入数据包才能输出帧
  • 你的代码中忽略了所有返回值校验,当avcodec_receive_frame调用失败时,inputFrame还是上一轮av_frame_unref后的空状态,data指针全部为NULL,传入sws_scale就会触发bad src pointers报错,输出帧没有被正确填充就会出现全绿画面
  • 第一帧正常是因为首次调用时解码器缓存为空,第一次发送数据包就能直接输出有效帧

修复步骤

1. 补充视频解码流程的返回值校验

修改视频处理分支的解码逻辑,只有确认成功拿到有效帧后再走后续缩放、编码流程:

if (choice == -1)
{
  // Video packet
  ret = av_read_frame(videoInFormatCtx, inputPacket);
  if (ret < 0) {
    // 读到流末尾或者读取出错,按需处理退出逻辑
    break;
  }
  
  ret = avcodec_send_packet(videoInCodecCtx, inputPacket);
  if (ret == AVERROR(EAGAIN)) {
    // 解码器缓存已满,先读取现有帧再发新包
    av_packet_unref(inputPacket);
  } else if (ret < 0) {
    throw std::runtime_error("发送视频解码包失败");
  }
  
  ret = avcodec_receive_frame(videoInCodecCtx, inputFrame);
  if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
    // 当前没有可输出的帧,直接进入下一轮循环
    av_frame_unref(inputFrame);
    av_packet_unref(inputPacket);
    continue;
  } else if (ret < 0) {
    throw std::runtime_error("接收视频解码帧失败");
  }

  // 后面原有的缩放、编码逻辑保持不变
  outputFrame->format = PIX_OUTPUT_FMT;
  outputFrame->width = width;
  outputFrame->height = height;
  // ... 原有后续代码
}

2. 额外适配优化

检查correct_for_deprecated_pixel_format函数是否正确适配了Mac平台屏幕采集输出的像素格式(MacOS屏幕采集常用AV_PIX_FMT_NV12、AV_PIX_FMT_BGRA等格式),避免像素格式不匹配导致的缩放异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:36:05