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);
- 第三步:修复内存泄漏问题
- 你代码中
unsigned char *bu = malloc(numBytes);分配的内存没有使用也没有释放,直接删除该行即可 - 解码完成后需要依次释放资源:
av_free(buffer);、av_frame_free(&pFrameRGB);、sws_freeContext(sws_ctx);以及其他已分配的FFmpeg结构体
- 你代码中
补充说明
调用sws_scale的参数本身没有问题,只要正确为目标帧分配好缓冲区即可正常运行。你设置的转换规则是将解码后的原始像素格式转成同等分辨率的RGB24格式,符合你的业务需求。
内容的提问来源于stack exchange,提问作者murage kibicho
相关产品推荐
相关产品推荐

