FFmpeg swscale实现ARGB转NV12输出无效NV12图像问题求助
问题定位
你代码的核心问题有3个:
- 像素格式不匹配:Qt平台的ARGB32帧内存存储顺序为B、G、R、A,对应FFmpeg的像素格式是
AV_PIX_FMT_BGRA,你当前使用的AV_PIX_FMT_ARGB字节序完全不符,导致转换出的NV12数据全部为非法值,FFmpeg校验失败就会抛出Invalid data found when processing input错误。 - 无返回值校验:你没有判断
sws_getContext的返回值,若该接口因参数错误、FFmpeg版本兼容等问题返回NULL,后续sws_scale调用完全无效,输出的帧数据是未初始化的垃圾值。 - 无输入长度校验:你没有校验输入
src的大小是否等于m_width * m_height * 4,如果输入数据长度不足,sws_scale会读取越界内存,生成的NV12数据自然非法。
修复建议
- 修改
sws_getContext的源像素格式参数为AV_PIX_FMT_BGRA - 增加
sws_getContext返回值非空判断,初始化失败直接终止转换逻辑 - 函数入口增加输入数据长度校验:
if (src.size() != m_width * m_height * 4) { return {}; }
验证方法
你可以通过FFmpeg生成标准测试文件快速验证:
# 生成320x240标准NV12测试帧 ffmpeg -f lavfi -i testsrc2=size=320x240:duration=1 -pix_fmt nv12 -vframes 1 test_std.nv12 # 确认你的输出文件大小和标准文件一致,均为115200字节 ls -l your_output.nv12 test_std.nv12
如果大小一致但仍无法解码,可通过二进制对比工具确认数据差异,优先排查像素格式匹配问题。
内容的提问来源于stack exchange,提问作者niXman
相关产品推荐
相关产品推荐

