X264编码(上)

来源:互联网 发布:粒子滤波 python 编辑:程序博客网 时间:2024/05/21 10:04

         前面讲到了关于NAL打包成RTP后进行发送,那么这些NAL应该怎么得到呢?当然如果有现成的H264数据就可以直接用了,但是一般我们的摄像头采集的数据都不是H264格式的,那就需要编码。而且在我们这个项目中是需要进行图像算法处理的,在这些opencv中用到的图基本上都是BGR格式的Mat图,所以处理完后的图像需要重新进行X264编码,生成一个个的NAL后打包成RTP发送出去,这样就会在实现高清的同时节省不少数据量,也就是H264的实质了。

      H.264ITU(International Telecommunication Unite 国际通信联盟)和MPEG(Motion Picture Experts Group 运动图像专家组)联合制定的视频编码标准H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准里称为H.264,在MPEG的标准里是MPEG-4的一个组成部分--MPEG-4 Part 10,又叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。x264始于2003年,从当开源社区的MPEG4-ASP编码器Xvid小有所成时开始的,经过几年的开发,特别是Dark Shikari加入开发后,x264逐渐成为了最好的视频编码器。FFmpeg的H264编码部分就是加入了X264模块的,所以实质上想进行H264编码那就用X264库编码吧。当然是开源的,百度或者谷歌下,网上资料很多,这里我主要讲下我再使用过程的一些总结吧。

      我喜欢采取的思路是先整体再细节,然后各个击破,具体问题再具体分析,所以我就先去搞清楚X264里的整体编码流程是怎样的,搞个现成的例程跑下当然是最好不过的了。我这里自己参考着写了个,有需要的可以去我的代码片中看下。https://code.csdn.net/snippets/284343

      首先,这2个结构的添充要完成:x264_param_t     m_param, x264_picture_t      m_pic;填充m_param首先给各个域一个默认值,调用:x264_param_default( &m_param )。m_pic要用X264_picture_alloc分配下;然后自己相应的做一些改变,最常用的有:

    m_param.rc.i_qp_constant = 25;//帧率
    m_param.rc.i_rc_method = X264_RC_CQP ;//rate control method
    m_param.i_width=640;//编码图像大小。
    m_param.i_height=480;

    然后就可以用这个m_param来打开一个encoder了,打开方法:m_h = x264_encoder_open( &m_param ) ;

    编码之前要添充好m_pic

        m_pic.i_type = X264_TYPE_AUTO;
        m_pic.i_qpplus1 = 0;
        m_pic.img.i_csp =X264_CSP_I420;
        m_pic.img.i_plane = 3;
        m_pic.img.i_stride[0] = 640;
        m_pic.img.i_stride[1] = 640 / 4;
        m_pic.img.i_stride[2] =640 / 4;
        m_pic.i_type = X264_TYPE_AUTO;
        m_pic.i_qpplus1 = 0;

    这些指明图象的大小,格式。还要指明输入一帧数据所有的缓冲区:

      m_pic.img.plane[0] 、m_pic.img.plane[1] 、m_pic.img.plane[2] 等。

    主要的就是调用x264_encoder_encode(m_h,&nal,&n_nal,&m_pic,&pic_out)编码了,编码时还要初始化一个pic_out和nal结构。nal则用于承载VCL编码后的数,编成多个nal帧。显然nal是一个数组,i_nal是数组下标的最大值,即数组边界。

     编码完成后要调用x264_picture_clean( x264_picture_t *pic )释放pic中的缓冲区,调用x264_encoder_close关闭编码器。

     下面就来具体讲讲在其中涉及的一些参数,结构以及编码得到的数据。


      

0 0
原创粉丝点击