首先是码流结构图:(H.264)

H264的编码格式:h264的功能分为两层,视频编码层(VCL网络提取层(NAL)

VCL功能是进行视频编解码,包括运动补偿预测,变换编码和熵编码等功能,目的是在尽可能独立于网络的情况下进行高效地编解码。

NAL用于采用适当的格式对VCL视频数据进行封装打包。它覆盖了所有的片级以上的语法级别。

其关系如图所示:


按码流结构:

层一是两种流格式,Annexb即字节流格式的码流主要用于存储,例如制作DVD(当然现在的DVD还不是用H.264),RTP格式码流主要用于网络传送,例如在线看电影。

AnnexB格式:NALU数据+开始前缀(00000001或000001,此处注意为甚么是4bit或3bit),针对的是H.320电话会议。

RTP   格式:NALU数据+20个字节的类似的并不符合RTP协议的RTP头。针对IP网络的RTP打包方式。为原始的NAL打包格式,就是开始的若干字节(1,2,4字节)是NAL的长度,而不是start_code,此时必须借助某个全局的数据来获得编码器的profile,level,PPS,SPS等信息才可以解码。

H.264协议只规定了字节流格式,没有规定 RTP 格式。JM 的 RTP 格式没有被用到任何场合场合中,成为了摆设。

层二是NAL Unit:

Android 视频解码框架 视频编解码框架_码流

    

Android 视频解码框架 视频编解码框架_码流_02


NALU第一字节就是包括3个语法结构: forbidden_zero_bit(1),nal_ref_idc(2),nal_unit_type(5),加起来正好一个字节, 如上图所示。

典型的RBSP单元序列如图下图所示,参数图像集PPS,增强信息SEI,图像定界符PD,编码片。



层三是片层Slice

 JM参考软件提供了两种分片方式,如图所示,分别是固定码率分片方式和固定宏块分片方式。

在固定码率分片方式中,每片所占用的比特数是一定的,由于宏块编码时候的复杂度不一样,每个宏块所占用的比特数也不一样,所以这种编码方式中每片中的宏块数目是不固定的。

在固定宏块分片方式,每片中的宏块数目是固定的,从而每片所占用的码率是不固定的。前者有利于减少由MTU太大而引起的分组损失,主要用于对片大小要求比较严格的环境中,如无线网络中;而后者能有效减小网络传输延迟,主要用于有线网络环境中。

在EBR编码,对片的大小和其中的宏块数目都有要求,需要有更先进的分片方法。

Android 视频解码框架 视频编解码框架_html_03

在无线信道传输中,片的长度严重影响到视频码流的容错性能。片的长度与RLC-PDU的长度是密切相关的。如果片的长度过大,每片数据需要多个RLC帧来传输。则当其中某一帧数据发生错误时,整片数据将无法恢复。但是,如果片过小,则增加了协议头的开销,不利于整个数据流的传输;另外如果片过小,不利于宏块间的预测,降低了压缩效率。因此,片的大小应当小于或等于RLC-PDU的大小,并且每帧图像至少有2到3片。

第三层是宏块结构(以HEVC为例)

Android 视频解码框架 视频编解码框架_码流_04

为了提高高分辨率视频的编码效率,HEVC采用了基于大尺寸的四叉树编码结构,CU、PU、TU描述如图:

Android 视频解码框架 视频编解码框架_Android 视频解码框架_05

Android 视频解码框架 视频编解码框架_Android 视频解码框架_06


Android 视频解码框架 视频编解码框架_数据_07

宏块编码过程中:

帧内预测编码技术:角度预测

                                   帧内planar和帧内DC预测

                                   参考像素平滑

                                    边界值平滑

                                   参考像素替换

                                   模式编码

帧间预测编码技术:宏块分割http://blog.chinaunix.net/uid-26000296-id-3764982.html

                                   分像素差值

                                  merge模式

                                  运动矢量预测

                                   运动补偿

                                   多帧预测

                                   环路滤波:(1)去块滤波DBF:只采用8x8结构,H.264中是4x4.先对垂直边缘进行水平滤波,再对水平边缘进行垂直滤波

                                                        (2)采样自适应偏移滤波器SAO:用在DBF之后,使用查表进行原始信号重建。对每个CTB,可以使用/禁用一种或两种模式:边缘偏移模式或                                                                   者带偏移模式。边缘偏移模式将采样像素值利用四种方向梯度模式与8个边缘像素中的两个比较,并对像素进行分类:minimum,两种                                                                        edges,maximum,或者neither。对于前四种模式,滤波器进行偏移操作。带偏移模式采用的偏移量基于某个单一采样值的幅度,依据                                                                     该幅度分为32个不同的band。四个连续的band指定一个偏移量。SAO旨在提高图像的质量,减少带状干扰和边缘震荡效应。

变换和量化:http://blog.chinaunix.net/uid-26000296-id-3764983.html

熵编码:http://blog.chinaunix.net/uid-26000296-id-3764985.html

                            CABAC

                            系数编码