FFmepg解码

作者: Shirley_iOS | 来源:发表于2016-06-28 22:32 被阅读274次

    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解码

        本文链接:https://www.haomeiwen.com/subject/paitjttx.html