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程序。
网友评论