很多使用FFmpeg做解码的用户都可能遇到过一个问题,他们对解码出来的图像转为RGB格式之后显示图像是颠倒的。有些用户对其原因不大明白,其实原因跟RGB图像的存储方式有关。RGB图像即RGB位图有两种存储方式:一种是从上往下扫描,另一种是从下往上扫描。从上扫描的图像第一行的首地址即为图像Buffer的起始地址,而从下往上扫描的图像第一行的首地址为:buffer_data + linesize*(height-1),其中buffer_data为图像Buffer的起始地址,linesize为图像的行字节宽度,对于RGB24图像,linesize = (width * 3 + 3)/4×4,对于YUV420图像,linesize = (width + 3)/4 *4。
对于颠倒显示的RGB图像我们可以用FFmpeg的函数把它翻转过来显示,处理方法很简单,下面是实现步骤和代码:
第一步:先定义几个用于FFmpeg解码和转换图像的变量。
AVCodec *codec;
AVCodecContext *codecCtx;
AVFrame *m_picture;
AVFrame *m_pFrameRGB;
SwsContext *m_pImgCtx;
uint8_t *m_PicBuf;
int m_PicBytes;
第二步:初始化变量。
m_pImgCtx = NULL;
m_PicBuf = NULL;
m_PicBytes = 0;
第三步:解码图像,并转换图像为RGB格式。</