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

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数据自然非法。

修复建议

  1. 修改sws_getContext的源像素格式参数为AV_PIX_FMT_BGRA
  2. 增加sws_getContext返回值非空判断,初始化失败直接终止转换逻辑
  3. 函数入口增加输入数据长度校验:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 17:15:03