FFmepg解码

FFmepg是音视频开发最常用的编解码库,功能很强大,是所有音视频开发人员必须要啃下去的硬骨头,对于没有底层开发基础的,学习他并不是很容易,这里着重介绍下FFmepg解码功能。参考代码:https://github.com/ShirleyiOS/iOSH264PlayDemo

注册FFmepg所有库,这是使用FFmepg的入口

av_register_all();

因为这里使用的是FFmepg解码功能,还要同时注册下其编解码库

avcodec_register_all();

查找解码器,因为这里是解码h264的数据,所以参数选择CODEC_ID_H264

m_pcodec = avcodec_find_decoder(CODEC_ID_H264);

初始化AVPacket,在h264中,一个packet对应一个nal单元

m_packet = new AVPacket;
av_init_packet(m_packet);

给编解码器分配内存

m_context = avcodec_alloc_context3(m_pcodec);

初始化编解码器的AVCodecContext

avcodec_open2(m_context, m_pcodec, NULL)

给视频帧分配内存

m_picture = av_frame_alloc();

以上都是解码的准备工作,下面介绍拿到h264的视频数据时,怎样将其解码成yuv数据

填充AVPacket结构体,data是h264数据,length是数据长度

m_packet->data = (unsigned char*)data;
m_packet->size = length;

下面是真正的解码函数

int nBytesConsumed = avcodec_decode_video2(m_context, m_picture, &nGotPicture, (const AVPacket*)m_packet);

得到的m_picture就是我们需要的数据,m_picture->data[0]存y,m_picture->data[1]存u, m_picture->data[2]存V,把这些数据处理成我们想要的就行。

最后别忘了释放相应的数据,这里不在贴相关代码,具体请参考文章一开始的demo程序。

你可能感兴趣的:(FFmepg解码)