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
相关产品推荐
相关产品推荐

