代码改变世界

FFmpeg编译出错_img_convert 找不到

2014-03-06 23:00  江湖么名  阅读(1017)  评论(0编辑  收藏  举报

问题出现在下载的ffmpeg的版本不一样,在0.4.8以前的版本中还有img_convert这个函数,新版本中用sws_getContext和sws_scale代替了。简单说明如下:

新版本的ffmpeg添加了新的接口:libswscale来处理图像缩放。

以前使用img_convert来把RGB转换成YUV12,现在使用新的接口。新接口更加标准和快速,而且里面有了MMX优化代码。换句话说,它是做缩放更好的方式。

用来缩放的基本函数是sws_scale。但一开始,必需建立一个SwsContext的概念。这将进行想要的转换,然后把它传递给 sws_scale函数。类似于在SQL中的预备阶段或者是在Python中编译的规则表达式regexp。要准备这个上下文,使用 sws_getContext函数,它需要源的宽度和高度,我们想要的宽度和高度,源的格式和想要转换成的格式,同时还有一些其它的参数和标志。然后我们像使用img_convert一样来使用sws_scale函数,唯一不同的是我们传递给的是SwsContext。

解决办法是将原有的img_convert函数改为sws_scale函数,原来的函数调用为:

img_convert((AVPicture *)pFrameRGB, PIX_FMT_BGR24, (AVPicture*)pFrame,
    pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height)

修改为

struct SwsContext *pSwsCtx;

pSwsCtx = sws_getContext (pCodecCtx->width,
    pCodecCtx->height,
    pCodecCtx->pix_fmt,
    pCodecCtx->width,
    pCodecCtx->height,
    PIX_FMT_BGR24,
    SWS_BICUBIC,
    NULL, NULL, NULL);

//反转图像 ,否则生成的图像是上下调到的
   pFrame->data[0] += pFrame->linesize[0] * (pCodecCtx->height - 1);
   pFrame->linesize[0] *= -1;
   pFrame->data[1] += pFrame->linesize[1] * (pCodecCtx->height / 2 - 1);
   pFrame->linesize[1] *= -1;
   pFrame->data[2] += pFrame->linesize[2] * (pCodecCtx->height / 2 - 1);
   pFrame->linesize[2] *= -1;
  //转换图像格式,将解压出来的YUV420P的图像转换为BRG24的图像

sws_scale (pSwsCtx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);