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

FFMPEG调用sws_scale转RGB报bad dst image pointers错误如何解决

问题原因

你遇到的bad dst image pointers错误核心原因是:仅调用av_frame_alloc()为pFrameRGB分配了AVFrame结构体本身的内存,但没有为RGB帧的像素数据缓冲区分配内存,导致sws_scale写入的目标地址是空指针。

修复步骤
  • 第一步:为pFrameRGB分配像素数据缓冲区
    在main函数中,AVFrame *pFrameRGB = av_frame_alloc();之后增加如下代码:
// 计算RGB24格式所需的缓冲区大小,设置对齐为1(也可使用32提升性能)
int num_bytes = av_image_get_buffer_size(AV_PIX_FMT_RGB24, codecContext->width, codecContext->height, 1);
// 分配缓冲区
uint8_t *buffer = (uint8_t *)av_malloc(num_bytes * sizeof(uint8_t));
// 将缓冲区绑定到pFrameRGB的data和linesize字段
av_image_fill_arrays(pFrameRGB->data, pFrameRGB->linesize, buffer, AV_PIX_FMT_RGB24, codecContext->width, codecContext->height, 1);
  • 第二步:修改帧保存逻辑为RGB格式
    你当前的save_gray_frame是保存灰度PGM格式的函数,需要新增保存RGB PPM格式的函数:
void save_rgb_frame(unsigned char *buf,int wrap,int xsize,int ysize, char *filename)
{
    FILE *f = fopen(filename, "wb");
    fprintf(f,"P6\n%d %d\n255\n",xsize,ysize);
    for(int i = 0; i < ysize; i++)
    {
        fwrite(buf + i*wrap, 1, xsize*3, f);
    }
    fclose(f);
}

然后在decode_packet函数中sws_scale调用完成后,替换原来的灰度保存逻辑:

// 原来的save_gray_frame调用替换为
char rgb_filename[1024];
snprintf(rgb_filename, sizeof(rgb_filename), "%s-%d.ppm","rgb_frame", codecContext->frame_number);
save_rgb_frame(pFrameRGB->data[0], pFrameRGB->linesize[0], codecContext->width, codecContext->height, rgb_filename);
  • 第三步:修复内存泄漏问题
    1. 你代码中unsigned char *bu = malloc(numBytes);分配的内存没有使用也没有释放,直接删除该行即可
    2. 解码完成后需要依次释放资源:av_free(buffer);、av_frame_free(&pFrameRGB);、sws_freeContext(sws_ctx);以及其他已分配的FFmpeg结构体
补充说明

调用sws_scale的参数本身没有问题,只要正确为目标帧分配好缓冲区即可正常运行。你设置的转换规则是将解码后的原始像素格式转成同等分辨率的RGB24格式,符合你的业务需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:06:02