同上面所写的两篇文章,本篇依然是介绍FFmpge的相关操作,前一篇讲的是视频压缩,本篇则相反的讲视频的解码。废话不多说,直接上代码吧。
同理于上篇,本篇先设计一个视频解码相关的类,定义如下:
class Ffmpeg_Decoder
{
public:
AVCodecParserContext *avParserContext;
AVPacket avpkt; //数据包结构体
AVFrame *m_pRGBFrame; //帧对象
AVFrame *m_pYUVFrame; //帧对象
AVCodec *pCodecH264; //解码器
AVCodecContext *c; //解码器数据结构对象
uint8_t *yuv_buff; //yuv图像数据区
uint8_t *rgb_buff; //rgb图像数据区
SwsContext *scxt; //图像格式转换对象
uint8_t *filebuf; //读入文件缓存
uint8_t *outbuf; //解码出来视频数据缓存
int nDataLen; //rgb图像数据区长度
IplImage* img; //OpenCV图像显示对象
uint8_t *pbuf; //用以存放帧数据
int nOutSize; //用以记录帧数据长度
int haveread; //用以记录已读buf长度
int decodelen; //解码器返回长度
int piclen; //解码器返回图片长度
bool finishInitScxt; //完成格式转换器初始化标志
public:
void Ffmpeg_Decoder_Init();//初始化
void Ffmpeg_Decoder_Show(AVFrame *pFrame, i