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

  • 相关阅读:
    opencv实现录屏
    numpy.where() 用法详解
    spring 配置quartz定时任务及时间设置
    http网络请求 返回不同的状态码
    28行代码带你理解机器学习原理
    sigmoid函数
    numpy运算简介(二)
    数论代码整理
    数论整理
    树状数组
  • 原文地址:https://www.cnblogs.com/awiki/p/13063063.html
Copyright © 2011-2022 走看看