【网络通信 -- 直播】视频流编码 -- H.264 编码的一般概念

【网络通信 -- 直播】视频流编码 -- H.264 编码的一般概念

【1】色彩空间 -- RGB YUV YCbCr

RGB 依据人眼识别的颜色定义出的空间,可表示大部分颜色;
YUV “Y”表示明亮度(Luminance或Luma),即灰阶值;“U”和“V” 表示色度(Chrominance或Chroma),用于描述影像色彩及饱和度,用于指定像素的颜色;YUV 色彩空间的重要性是其亮度信号Y和色度信号U、V是分离的;
YCbCr YUV经过缩放和偏移的翻版,其中“Y”表示明亮度(Luminance或Luma),即灰阶值;Cb指蓝色色度分量,Cr指红色色度分量;

YCbCr 主要的采样格式 : YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1 和 YCbCr 4:4:4
YUV 4:4:4 :
四个像素为:        [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的码流为:    Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

YUV 4:2:2 :
四个像素为:        [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的码流为:    Y0 U0 Y1 V1 Y2 U2 Y3 V3
映射出像素点为: [Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

YUV 4:1:1 :
四个像素为:        [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的码流为:    Y0 U0 Y1 Y2 V2 Y3
映射出像素点为: [Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]

YUV4:2:0 :
八个像素为:              [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
                                 [Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7] [Y8 U8 V8]
存放的码流为:          Y0 U0 Y1 Y2 U2 Y3
                                 Y5 V5 Y6 Y7 V7 Y8
映射出的像素点为:    [Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]
                                  [Y5 U0 V5] [Y6 U0 V5] [Y7 U2 V7] [Y8 U2 V7]

RGB 与 YUV 互转公式

RGB --> YUV 转换公式:
Y= 0.256788*R + 0.504129*G + 0.097906*B +  16;
U=-0.148223*R - 0.290993*G + 0.439216*B + 128;
V= 0.439216*R - 0.367788*G - 0.071427*B + 128;

YUV --> RGB 转换公式:
B= 1.164383 * (Y - 16) + 2.017232*(U - 128);
G= 1.164383 * (Y - 16) - 0.391762*(U - 128) - 0.812968*(V - 128);
R= 1.164383 * (Y - 16) + 1.596027*(V - 128);

【2】H.264 基本概念

【2.1】帧和场

视频的一场或一帧可用来产生一个编码图像,视频帧可分成连续或隔行视频帧;为减少大面积闪烁现象,把一帧分成两个隔行的场,此时场内邻行之间的空间相关性较强(适用于活动量较大的运动图像的编码),帧内邻近行空间相关性强(适用于静止的图像的编码);

【2.2】宏块、片、片组

宏块  一个编码图像通常划分成若干宏块组成,一个宏块由一个 16×16 亮度像素和附加的一个 8×8 Cb 和一个 8×8 Cr 彩色像素块组成;

一个视频图像可编码成一个或更多个片,每片包含整数个宏块(MB),即每片至少一个 MB,最多时每片包含整个图像的宏块,一幅图像中每片的宏块数不一定固定;设片的目的是为了限制误码的扩散和传输,使编码片之间相互独立,某片的预测不能以其它片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其它片中去;

类型描述说明
I frames/slices (Intra)I宏块I 宏块,利用从当前片中已解码的像素作为参考进行帧内预测;
P frames/slices (Predicted)

I宏块、P宏块

P 宏块利用前面已编码图象作为参考图象进行帧内预测

B frames/slices (Bi-Predicted)I宏块、B宏块B 宏块则利用双向的参考图象(当前和未来的已编码图象帧)进行帧内预测
SI-frames/slices (switching I)SI宏块SI宏块,用于不同编码流之间的切换
SP-frames/slices (switching P)I宏块、P宏块

片头规定了片的类型,该片属于哪个图像,有关的参考图像等
MB 头单元

片组 一个编码图象中若干 MB 的一个子集,它包含一个或若干个片;在一个片组中,每片的 MB 按光栅扫描次序被编码,如果每幅图象仅取一个片组,则该图象中所有的 MB 均按光栅扫描次序被编码;

MB 到片组的映射

【2.3】档次和级

H.264 规定了三种档次,每个档次支持一组特定的编码功能,并支持一类特定的应用

  • 1) 基本档次(Base Profile):利用 I 片和 P 片支持帧内和帧间编码,支持利用基于上下文的自适应的变长编码进行的熵编码 (CAVLC),主要适用于可视电话、会议电视、无线通信等实时视频通信的场景;
  • 2) 主要档次(Main Profile):支持隔行视频,采用 B 片的帧间编码和采用加权预测的帧内编码;支持利用基于上下文的自适应的算术编码 (CABAC),主要适用于数字广播电视与数字视频存储的场景;
  • 3) 扩展档次(Extended Profile):支持码流之间有效的切换(SP 和 SI 片)、改进误码性能(数据分割),但不支持隔行视频和 CABAC;
  • 4) 高端档次(High Profile):在 Main 的基础上增加了 8x8 内部预测、自定义量化、无损视频编码,并支持更多的 YUV 格式(如 4 : 4 : 4),适用于广播及视频碟片存储(蓝光影片),高清电视的场景;

【2.4】H264 SVC

可适性视讯编码或可分级视频编码 (Scalable Video Coding,SVC) 是传统 H.264/MPEG-4AVC 编码的改良,可更大的提升编码弹性,并具有时间可适性 (Temporal Scalability)、空间可适性(Spatial Scalability) 及讯杂比(质量)可适性 (SNR Scalability) 三大特性,使视讯传输更能适应在异质的网络带宽;简而言之,就是把视频序列分成不同的部分并赋予不同的等级,根据实际的环境来选择解码;

视频通讯中可能出现的问题

  • 1. 带宽问题,IP 网络带宽是不稳定的,网络带宽降低时,视频流应该自动的降低码率,以适应当前带宽;视频流码率的降低,其帧率和分辨率相应降低,但仍然可以维持基本的视频通信,如帧率可以从 60fps 降低 30fps 或者 25fps 甚至 20pfs;分辨率可以从高清降到标清的 4cif 甚至 cif;这样可以很大程度的降低码率,但同时保证视频通信的基本功能正常进行;
  • 2. 终端问题,在现在的通信中,参与视频对话的终端多种多样,有专用的硬件视频终端,有桌面软终端,还有移动终端中的 PAD 和手机;终端的多样性对视频码流的要求也不一样,如移动终端一般相对带宽较小,且屏幕尺寸也较小,屏幕宽高比也不同;每种终端希望拿到最适合自己的视频码流,既适合自己的网络带宽,又适合自己的硬件能力,如一种设备编码流出来后,其中既包含了高清到标清不同分辨率,又具有各种帧率,终端只需要发起申请,从其中拿到适合自己的码流,这将避免转码,同时合理的利用的带宽和终端的硬件能力;

SVC 的本意是实现码流的可伸缩,即能根据带宽,终端的要求,自动调整发送给终端视频流的格式;一次性编码适应于多种信道和终端;SVC 技术的应用理论上能节省 MCU 的部分计算资源,但一路 SVC 码流实际上是多组码流构成的,且是相互独立的,如果全部传输和存储必然导致带宽和容量的增加;因此这种技术适合使用在中央设备上 (如 MCU),不适用于终端;

【3】H264 的码率控制模式

视频编码 (有损) 的目标是尽可能多的节省比特的同时尽量保持视频质量,码率控制是平衡码率和质量的重要工具;

  • CBR (Constant Bit Rate) 码率优先,以恒定比特率方式进行编码,有运动 (Motion) 发生时,由于码率恒定,只能通过增大量化参数 (Quantization Parameter, QP) 来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定;
  • VBR (Variable Bit Rate) 图像质量优先,动态比特率,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,运动 (Motion) 发生时,马赛克很少;码率控制算法根据图像内容确定使用的比特率,图像内容比较简单则分配较少的码字,图像内容复杂则分配较多的码字,这样既保证了质量,又兼顾带宽限制;
  • CVBR (Constrained Variable Bit Rate) 是 VBR 的一种改进方法,该算法对应 Maximum BitRate 恒定或者 Average BitRate 恒定,该方法在图像内容静止时,节省带宽,有运动 (Motion) 发生时,利用前期节省的带宽来尽可能的提高图像质量,达到同时兼顾带宽和图像质量的目的;这种方法通常会让用户输入最大码率和最小码率,静止时,码率稳定在最小码率,运动时,码率大于最小码率,但是又不超过最大码率;

【4】H264 中的 SPS PPS

【4.1】SPS 简介

SPS (Sequence Paramater Set,序列参数集),其中保存了一组编码视频序列 (Coded Video Sequence) 的全局参数,编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列,而每一帧编码后数据所依赖的参数保存于图像参数集中;

SPS 抓包结果

SPS 语法分析

  • profile_idc,标识 H264 的档次(profile)
    • 66 -> baseline profile
    • 77 -> main profile
    • 88 -> extended profile
  • constraint_set0_flag ~ constraint_set5_flag,在编码的档次方面对码流增加的其他一些额外限制性条件
  • level_idc,标识当前码流的 Level,编码的 Level 定义了某种条件下的最大视频分辨率、最大视频帧率等参数
  • seq_parameter_set_id,表示当前的序列参数集的 id,通过该 id 值,图像参数集 PPS 可以引用其代表的 SPS 中的参数
  • log2_max_frame_num_minus4,MaxFrameNum = 2^(log2_max_frame_num_minus4 + 4),MaxFrameNum 是 frame_num 的上限值,frame_num 是图像序号的一种表示方法,在帧间编码中常用作一种参考帧标记的手段
  • pic_order_cnt_type,表示解码 picture order count(POC) 的方法,POC 是另一种计量图像序号的方式
  • log2_max_pic_order_cnt_lsb_minus4,MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4),MaxPicOrderCntLsb 表示 POC 的上限
  • max_num_ref_frames,表示参考帧的最大数目
  • gaps_in_frame_num_value_allowed_flag,说明 frame_num 中是否允许不连续的值
  • pic_width_in_mbs_minus1,用于计算图像的宽度,单位为宏块个数,frame_width = 16 × (pic_width_in_mbs_minus1 + 1)
  • pic_height_in_map_units_minus1,使用 PicHeightInMapUnits 来度量视频中一帧图像的高度,PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1
  • frame_mbs_only_flag,说明宏块的编码方式
    • 当该标识位为 0 时,宏块可能为帧编码或场编码;PicHeightInMapUnits 表示一场数据按宏块计算的高度
    • 该标识位为 1 时,所有宏块都采用帧编码;PicHeightInMapUnits 表示一帧数据按宏块计算的高度
  • mb_adaptive_frame_field_flag,说明是否采用了宏块级的帧场自适应编码;
    • 当该标识位为 0 时,不存在帧编码和场编码之间的切换;
    • 当该标识位为 1 时,宏块可能在帧编码和场编码模式之间进行选择
  • direct_8x8_inference_flag,用于 B_Skip、B_Direct 模式运动矢量的推导计算
  • frame_cropping_flag,说明是否需要对输出的图像帧进行裁剪
  • vui_parameters_present_flag,说明 SPS 中是否存在 VUI 信息

【4.2】PPS 简介

PPS (Picture Paramater Set,图像参数集);

PPS 抓包结果

PPS 语法分析

  • pic_parameter_set_id,表示当前 PPS 的 id,某个 PPS 在码流中会被相应的 slice 引用
  • seq_parameter_set_id,表示当前 PPS 所引用的激活的 SPS 的 id
  • entropy_coding_mode_flag,熵编码模式标识,该标识位表示码流中熵编码/解码选择的算法
  • bottom_field_pic_order_in_frame_present_flag,用于表示另外条带头中的两个语法元素 delta_pic_order_cnt_bottom 和 delta_pic_order_cn 是否存在的标识,这两个语法元素表示了某一帧的底场的 POC 的计算方法
  • num_slice_groups_minus1,表示某一帧中 slice group 的个数
  • num_ref_idx_l0_default_active_minus1、num_ref_idx_l0_default_active_minus1,表示当 Slice Header 中的 num_ref_idx_active_override_flag 标识位为 0 时,P/SP/B slice 的语法元素 num_ref_idx_l0_active_minus1 和 num_ref_idx_l1_active_minus1 的默认值
  • weighted_pred_flag,表示在 P/SP slice 中是否开启加权预测
  • weighted_bipred_idc,表示在 B Slice 中加权预测的方法
  • pic_init_qp_minus26 和 pic_init_qs_minus26,表示初始的量化参数
  • chroma_qp_index_offset,用于计算色度分量的量化参数
  • deblocking_filter_control_present_flag,用于表示 Slice header 中是否存在用于去块滤波器控制的信息
  • constrained_intra_pred_flag,若该标识为 1,表示 I 宏块在进行帧内预测时只能使用来自 I 和 SI 类型宏块的信息;若该标识为 0,表示 I 宏块可以使用来自 Inter 类型宏块的信息
  • redundant_pic_cnt_present_flag,用于表示 Slice header 中是否存在 redundant_pic_cnt 语法元素

参考致谢

本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】新一代视频压缩编码标准H.264

【2】YUV、YCbCr与RGB的区别

【3】基础:关于YUV 和 Cr Cb的区别

【4】H.264数据元素:序列、图像、片、宏块、块

【5】H264基本概念之 宏块、片和片组

【6】H264码流中SPS PPS详解

【7】如何解析SDP中包含的H.264的SPS和PPS串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值