zoukankan      html  css  js  c++  java
  • 视频编解码相关基础知识(二)---H.264简介

    H.264编码常用参数

      1.profile

      profile是代表编码器能力的,一般有BP、MP、HP。越高级的profile性能需求越强。

      typedef enum VENC_H264PROFILETYPE {

      VENC_H264ProfileBase  =  66,   /* Baseline Profile*/

      VENC_H264ProfileMain  =  77,   /* Main Profile*/

      VENC_H264ProfileHigh  =  100,   /* High Profile*/}

      2.Level

      对应不同的分辨率、比特率、宏块数和帧率等。Level越高,对应的级别越大。

      3.QpRange

      typedef struct VencQpRange{

          int nmaxqp;

          int nminqp;

      }vencQpRange;

      Qp区间,Qp值对应量化步长的序号,对于亮度取值0-51,对于色度取值0-39。值越小,量化步长越小,量化的精度就越高,意味着同样画质的情况下,产生的数据量可能更大。Qp值每增加6,量化步长就增加1倍。

      模拟信号转化为数字信号,需要有一个取值的间隔。

      min qp 最小量化步长

      设置X264可以使用的最小量化器。量化参数越小,输出越接近输入,使用某些值时,X264的输出可以和输入看起来完全一样,虽然其实并不是精确相同的。如果开启了自适应量化器(默认开启),则不鼓励提高qmin的值,那样可能会降低帧的平坦部分的质量。

      max qp 最大量化步长

      qmin的反面,设置X264可以使用的最大量化器,默认值时51。时H.264标准中的最大值,质量非常低。默认值51相当于没有设置qpmax。

      4.FixQp

      固定Qp参数,不使用码率控制,固定Qp。

    H.264的NAL单元及码流结构

      在H.264/AVC视频编码标准中,整个系统框架被分为两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质的传播,现实中传输系统时多样化的,其可靠性,服务质量,封装方式等特征各不相同。NAL这一概念的提出提供了视频编解码器和传输系统的友好接口,使得编码后的视频数据能够有效的在各种不同的网络环境中传输。

      在H.264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个I帧结束。

      一个序列的第一个图像叫做IDR图像图像,IDR图像都是I帧图像。H264引入IDR图像是为了解码的同步,当解码解到IDR图像时,立即将参考帧队列清空,将已解锁的数据全部输出或抛弃,重新查找参数集,开始一个新序列。

    H.264码流结构

      VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能的独立于网络进行高效的编码。

      NAL:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。

      NAL组成:NALU(Nal Unit)= NALU头 + RBSP

      在VCL数据传输或存储之前,这些编码的VCL数据,先被映射或封装进NAL单元,每个NALU包括一个原始字节序列负荷(RBSP,Raw Byte Sequence Paylead),一组对应于视频编码的NALU头部信息。RBSP的基本结构是:在原始编码数据的后面添加了结尾比特。

      RBSP序列举例


    SPS SEI PPS I片 图像定界符 P片 P片

      SPS即"Sequence Paramater Set",又称作序列参数集。SPS中保存了一组编码视频序列的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。SPS的NAL Unit  通常位于整个码流的起始位置,NAL Unit Type = 7。

      PPS即"Picture Paramater Set",又称图像参数集。

      H264码流:SPS + PPS + SEI +I帧

      一个原始的H.264NALU单元常由[startcode] + [NAL Header] + [Unit Payload]三部分组成。

      拓展2:H264的NAL Header 组成:F:forbidden_zero_bit,在H.264规范中规定这一位必须为0,禁止位0表示正常,1表示错误,一般都是0;

      NRI:2个比特,nal_ref_idc,取00~11,表示这个NALU的重要性,如00的NALU的解码器可以丢弃它而不影响图像的回放;

      Type:5个比特,重要的nal_unit_type,这个NAL单元的类型。

      H265的NAL Header组成:(H265的NAL Header 比264多一个字节)(抛一个265格式解析链接:(H265码流分析:https://www.cnblogs.com/lidabo/p/11856799.html)

      forbidden_zero_bit = 0;

      nal_unit_type = 32:占6个比特,用来用以指定NALU类型;

      nuh_reserved_zero_6bit = 0:占6位,预留位,要求为0,用于未来扩展或3D视频编码;

      nuh_temporal_id_plus1 = 1:占3个bit,表示NAL所在的时间层ID。

      

      具体H264码流结构可参照链接https://www.jianshu.com/p/24f2a069dd7e

      

      

  • 相关阅读:
    LeetCode 189. Rotate Array
    LeetCode 965. Univalued Binary Tree
    LeetCode 111. Minimum Depth of Binary Tree
    LeetCode 104. Maximum Depth of Binary Tree
    Windows下MySQL的安装与配置
    LeetCode 58. Length of Last Word
    LeetCode 41. First Missing Positive
    LeetCode 283. Move Zeroes
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
    删除docker下的镜像
  • 原文地址:https://www.cnblogs.com/RanWhoo/p/12361623.html
Copyright © 2011-2022 走看看