zoukankan      html  css  js  c++  java
  • H.264学习笔记

    H264算法流程图  https://www.cnblogs.com/ioleon13/archive/2010/03/12/1684354.html

    一. H.264 (http://www.baike.com/wiki/H264

    三大标准: 

    AVC(Advanced Video Coding,AVC)

    H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。 

    H264标准各主要部分有Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary coded picture(基本图像编码),Redundant Coded Picture(冗馀图像编码)。还有Instantaneous Decoding Refresh(IDR,即时解码刷新)、Hypothetical Reference Decoder(HRD,假想参考解码)、Hypothetical Stream Scheduler(HSS,假想码流调度器)。

    SVC(Scalable Video Coding – 可分级视频编码)  http://www.skyvio.com/htm/2007-05/33.htm

    实际应用中,存在不同的网络和不同的用户终端,各种情况下对视频质量的需求不一样。例如,在利用网络传输视频信息时,由于网络带宽限制了数据传输,因此要求当网络带宽较小的时候,只传输基本的视频信号,并根据实际网络的状况决定是否传输增强的视频信息,使视频的质量得到加强。

    在这样的背景下,利用可分级视频编码技术实现一次性编码产生具有不同帧率、分辨率的视频压缩码流,然后根据不同网络带宽、不同的显示屏幕和终端解码能力选择需要传输的视频信息量,以此实现视频质量的自适应调整。
    为了能够实现从单一码流中解码得到不同帧率(时间可分级)、分辨率(空间可分级)和图像质量(SNR可分级)的视频数据的编码技术。
    H.264 SVC以H.264 AVC视频编解码器标准为基础,利用了AVC编解码器的各种高效算法工具,在编码产生的编码视频时间上(帧率)、空间上(分辨率)可扩展,并且是在视频质量方面可扩展的,可产生不同帧速率、分辨率或质量等级的解码视频。

    H264可分级视频编码采用分层编码方式实现,由一个基本层(Base Layer)和多个增强层(Enhancement Layer)组成,增强层依赖基本层的数据来解码。其中,基本层(base layer)编码了基本的视频信息,实现了最低图像分辨率、帧率,并且基本层的编码是兼容H264/AVC编码标准的,能够采用H264/AVC解码器进行解码。 

    MVC 多视角视频编码(Multiview video coding)

    是在H.264标准当中新增的内容,其历史渊源和概况可以参照《Overview of Multi-view Video Coding》这篇论文。

    在双目3D视频中,通常需要提供left/right view两个视点的图像,这两个视点的图像是有相关性的,同样,对于多view视图之间也是有一定相关性的,因此很自然的想法就是要利用view之间的相关性来提高压缩效率,这就是MVC的目的。
     
    MVC主要用在3D电影领域,同一个电影场景,左眼和右眼看到的是不同的View,我们的产品暂时用不到。

    二. AVC里的 I B P 帧,openh264里没有B帧

    I帧(I frame)又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。
    在MPEG编码的过程中,部分视频帧序列压缩成为I帧;部分压缩成P帧;还有部分压缩成B帧。
    I帧法是帧内压缩法,也称为“关键帧”压缩法。
    I帧法是基于离散余弦变换DCT(Discrete Cosine Transform)的压缩技术,这种算法与JPEG压缩算法类似。采用I帧压缩可达到1/6的压缩比而无明显的压缩痕迹。

    I帧特点:
    1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输; 2.解码时仅用I帧的数据就可重构完整图像;
    3.I帧描述了图像背景和运动主体的详情; 4.I帧不需要参考其他画面而生成;
    5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量); 6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
    7.I帧不需要考虑运动矢量; 8.I帧所占数据的信息量比较大。

    P帧:前向预测编码帧。 P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。
    在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。

    P帧特点:
    1.P帧是I帧后面相隔1~2帧的编码帧; 2.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
    3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像; 4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
    5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧; 6.由于P帧是参考帧,它可能造成解码错误的扩散 (error propagation) ; 7.由于是差值传送,P帧的压缩比较高。

    B帧:双向预测内插编码帧。 B帧的预测与重构 B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。
    接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。

    B帧特点:
    1.B帧是由前面的I或P帧和后面的P帧来进行预测的; 2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
    3.B帧是双向预测编码帧; 4.B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确; 5.B帧不是参考帧,不会造成解码错误的扩散

    三. SVC里的 T0, T1,T2,T3帧

    refto: http://wk.baidu.com.cn/view/d70494365727a5e9856a6157?pn=4&pu=#1

     

    Temprol layer 时域分层,fps变的可以动态调整

    码流中,T0帧 61开头, T1帧 01开头,61优先级更高

    四. IDR (Instantaneous Decoding Refresh)

    IDR会导致DPB(DecodedPictureBuffer 参考帧列表——这是关键所在)清空, 在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容

    refto: http://blog.csdn.net/heanyu/article/details/6255111

    IDR 一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。 I和IDR帧都使用帧内预测。I帧不用参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧的。

    IDR就不允许这样。 其核心作用是,是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。

    这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。

    五、SDP

    IDR & SPS PPS : OpenH264中SPSPPS包不单独发送,会和IDR包打在一起,在IDR包的最后才有RTP包结束的Mark标记。

    SPS/PPS里包含的信息有:

    https://www.cnblogs.com/wainiwann/p/7477794.html

    h.264 RTP Payload:

    http://www.cppblog.com/czanyou/archive/2009/12/25/67940.html 

    packetization-mode = 0 一个NAL打成一个RTP包
    packetization-mode = 1 多个NAL组合成一个RTP包 (SCR中,spark都是用这个的)
    packetization-mode = 2 一个NAL包可以分成多个RTP包

    六、Encode Parameters:

    maxFS = width/16(ceiling) * height/16(ceiling)
    maxMBPS = maxFS * maxFPS/100

    90p: 160*90      maxFS=60     maxMBPS=1800
    180p: 320*180     maxFS=240     maxMBPS=7200
    270p: 480*270      maxFS=510      maxMBPS=15300
    360p: 640*360      maxFS=920     maxMBPS=27600
    432p: 768*432      maxFS=1296    maxMBPS=38880
    504p: 896*504      maxFS=1792    maxMBPS=53760
    576p: 1024*576     maxFS=2304    maxMBPS=69120
    648p: 1152*648     maxFS=2952    maxMBPS=88560
    720p: 1280*720     maxFS=3600    maxMBPS=108000
    1080p: 1920*1080    maxFS=8160      maxMBPS=244800
    4k: 3840 × 2160        maxFS =34560     maxMBPS= 122400(8160*15)

    七. 码流分析   转自https://www.cnblogs.com/zoneofmine/p/10784276.html

    SODB(String of Data Bits,数据比特串):

    最原始,未经过处理的编码数据


    RBSP(Raw Byte Sequence Payload,原始字节序列载荷):

    在SODB的后面填加了结尾bit(RBSP trailing bits 一个bit ‘1’)若干bit ‘0’,以便字节对齐。


    EBSP(Encapsulated Byte Sequence Payload, 扩展字节序列载荷):

    NALU的起始码为0x000001或0x00000001(起始码包括两种:3 字节(0x000001) 和 4 字节(0x00000001),在 SPS、PPS 和 Access Unit 的第一个 NALU 使用 4 字节起始码,其余情况均使用 3 字节起始码。)

    同时H264规定,当检测到0x000000时,也可以表示当前NALU的结束。那这样就会产生一个问题,就是如果在NALU的内部,出现了0x000001或0x000000时该怎么办?

    在RBSP基础上填加了仿校验字节(0x03)它的原因是:在NALU加到Annexb上时,需要填加每组NALU之前的开始码StartCodePrefix,如果该NALU对应的slice为一帧的开始则用4位字节表示,0x00000001,否则用3位字节表示0x000001.为了使NALU主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。也称为脱壳操作。

     

    八. QP

    量化参数qp_max过小,导致固定码率控制失效。 webex 360p qp scope (22~30)

    QP值对应量化步长的序号,对于亮度而言,此值范围为0~51 。值越小,量化步长越小,量化的精度就越高,意味着同样画质的情况下,产生的数据量可能会更大。QP值每增加6,量化步长就增加一倍。其对应关系如下表1。

    九、Packetization-mode = 0 | 1 | 2

    0   I 帧不被拆分

    1   I 帧被拆分成多个部分( NAL/OBU )来进行传输     

    2   一个包多个I 帧

    h264 720p will use 4 slices which means 4 NALs per frame

    Effectively, fragmentation. A frame (or more generally, a Temporal Unit) is made up of a number of different OBUs (similar to NALUs). These can be split across packets, including in the middle of an OBU, but not across frame boundaries

  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/awiki/p/13063063.html
Copyright © 2011-2022 走看看