1 H265 概述
H264 與 H265 的區別
-
傳輸碼率:H264 由于算法優化,可以低于 2Mbps 的速度實現標清數字圖像傳送;H.265 High Profile 可實現低于 1.5Mbps 的傳輸帶寬下,實現 1080p 全高清視頻傳輸。
-
編碼架構:H.265/HEVC 的編碼架構大致上和 H.264/AVC 的架構相似,主要也包含幀內預測 (intra prediction)、幀間預測 (inter prediction)、轉換 (transform)、量化 (quantization)、去區塊濾波器 (deblocking filter)、熵編碼 (entropy coding) 等模塊,但在 HEVC 編碼架構中,整體被分為了三個基本單位,分別是編碼單位 (coding unit, CU)、預測單位 (predict unit, PU) 和轉換單位 (transform unit, TU)。
-
編碼單位:H.264 中每個宏塊 (macroblock/MB) 大小是 8x8 或者 16x16 像素,而 H.265 的編碼單位可以選擇從最小的 8x8 到最大的 64x64。
-
幀內預測方式:H.265 的幀內預測模式支持 33 種方向 (H.264 只支持 8 種),并且提供了更好的運動補償處理和矢量預測方法。
-
編碼視頻大小:在相同的圖象質量下,相比于 H.264,通過 H.265 編碼的視頻大小將減少大約 39 - 44%。由于質量控制的測定方法不同,這個數據也會有相應的變化。
-
信噪比 PSNR:通過主觀視覺測試得出的數據顯示,在碼率減少 51 - 74% 的情況下,H.265 編碼視頻的質量還能與 H.264 編碼視頻近似甚至更好,其本質上說是比預期的信噪比 (PSNR) 要好。
-
運算需求:由于 h265 比較 h264 壓縮率更高,編碼視頻更小,所以對機器的運算需求也要更大。
-
預測塊大小:HEVC 將之前標準中定義的宏塊 (macroblocks) 用一種最大到 64x64 像素的并且可以進一步細分成可變大 小的塊。HEVC 把編碼樹單元 (coding tree units (CTUs)) 變成亮度和色度的編碼塊 (coding tree blocks (CTBs))。一個 CTB 可以大小為 64x64、32x32 或者 16x16。這樣幀內 (intra-picture) 和幀間 (inter-picture) 的預測塊 (prediction units,PU) 大小從 64x64 到 4x4 大小,只是對于雙向預測,只能到 8x4 到 4x8 大小。預測殘差編碼的變換塊大小可以是 32x32、16x16、8x8、4x4。
-
內部色深的增加:內部色深增加 (Internal bit depth increase (IBDI)) 可以讓編碼器運行在色寬更高的內部狀態。IBDI 最多可以作用于 14-bit 位寬。
-
并行處理工具 (Parallel processing tools):可以把圖像分成獨立編解碼的矩形塊和條帶,即條帶 slice 和 tile 瓷片的概念。條帶大部分可以單獨解碼,只是最終需要同步成一個視頻流。條帶可以編碼成條帶間沒有預測,互相獨立。當然條帶間可能還是需要環路濾波的。
-
熵編碼 (Entropy coding):HEVC 采用基于上下文自適應的熵編碼算法 (context - adaptive binary arithmetic coding (CABAC)),和 H.264 類似。只不過 HEVC 只支持 CABAC 編碼。
-
幀內預測 (intra prediction):HEVC 的幀內預測有 33 個方向模式,而 h.264 中只有 8 個,HEVC 還指定了 planar 和 DC 幀內預測模式。
-
幀間預測模式:本質上 H.265 是在 H.264 基礎上增加插值的抽頭系數個數,改變抽頭系數值以及增加運動矢量預測值的候選個數,以達到減少預測殘差的目的。H.265 與 H.264 一樣插值精度都是亮度到 1/4,色度到 1/8 精度,但插值濾波器抽頭長度和系數不同。H.265 的增加了運動矢量預測值候選的個數,而 H.264 預測值只有一個。
-
運動補償 (Motion compensation):HEVC 采用半像素或者 1/4 像素的精度運動補償,以及 7 抽頭或者 8 抽頭的濾波器。H.264 使用半像素精度和 6 抽頭的濾波器。對于 4:2:0 視頻的色度分量有 1/8 像素精度和 4 抽頭的濾波器。HEVC 中的加權預測可以是單向也可以是雙向的預測。
-
運動矢量預測 Motion vector prediction:HEVC 定義了 16-bit 的水平和垂直運動矢量,支持范圍到
[-32768, 32767]
,即最多 - 8192 到 8191.75 個亮度像素點,H.264 只支持到 - 512 到 511.75 個像素點。HEVC 的 MV 模式有高級運動矢量預測 (Advanced Motion Vector Prediction (AMVP)) 和合并模式。合并模式運行從鄰近塊繼承 mv 向量值,從而有 skip 和 direct 模式。 -
環路濾波器:HEVC 有兩個環路濾波器,解塊濾波器 (DBF, deblocking filter) 與樣本自適應偏移量 (SAO, sample adaptive offset) 濾波器 (DBF)。Deblocking 濾波器和 H.264/MPEG-4 AVC 中的類似,HEVC 中 的 DBF 只能用于 8x8 的塊 (提高并行處理性能),而 H.264 適用于 4x4 的塊。HEVC 中 DBF 的強度從 0 到 2,對垂直邊界做水平濾波,對水平邊界做垂直濾波。SAO 濾波器在 DBF 濾波器之后,為了更好的重建原始圖像。每個 CTB 的 SAO 濾波器可以使能或者禁止邊界偏移模式或者子段偏移模式。
-
去塊濾波:本質上 H.265 的去塊濾波與 H.264 的去塊濾波及流程是一致的,做了如下最顯著的改變:濾波邊界,H.264 最小到 4x4 邊界濾波;而 H.265 適應最新的 CU、PU 和 TU 劃分結構的濾波邊緣,最小濾波邊界為 8x8 ;濾波順序,H264 先宏塊內采用垂直邊界,再當前宏塊內水平邊界;而 H.265 先整幀的垂直邊界,再整幀的水平邊界。
-
內部比特深度增加:為了保證中間預測、變換以及量化過程中的內部比特精度,以達到更好的壓縮性能。
-
并行化設計:當前芯片架構已經從單核性能逐漸往多核并行方向發展,因此為了適應并行化程度非常高的芯片實現,HEVC/H.265 引入了很多并行運算的優化思路。
2 H265 分層結構
- 視頻編碼層(VCL):負責原始視頻數據壓縮。
- 網絡抽象層(NAL):將壓縮數據封裝為 NALU 單元,適配網絡傳輸。
3 H265 碼流結構
1. Start Code
- 標識 NALU 開始,格式為
0x00000001
(4 字節)或0x000001
(3 字節)。
2. NALU Header(2 字節)
字段 | 位數 | 描述 |
---|---|---|
forbidden_zero_bit | 1 | 禁止位,默認 0,錯誤時置 1。 |
nal_unit_type | 6 | NALU 類型(如 VPS=32,SPS=33,PPS=34,I 幀 = 16-21 等)。 |
nuh_layer_id | 6 | 層 ID,預留擴展位,默認 0。 |
nuh_temporal_id_plus1 | 3 | 時域 ID,值為實際 ID+1。 |
nal_unit_type 表
nal_unit_type | Name of nal_unit_type | Content of NAL unit and RBSP syntax structure | NAL unit type class | |
---|---|---|---|---|
0 | TRAIL_N | Coded slice segment of a non - TSA, non - STSA trailing picture slice_segment_layer_rbsp() | VCL | |
1 | TRAIL_R | Coded slice segment of a non - TSA, non - STSA trailing picture slice_segment_layer_rbsp() | VCL | |
2 | TSA_N | Coded slice segment of a TSA picture slice_segment_layer_rbsp() | VCL | |
3 | TSA_R | Coded slice segment of a TSA picture slice_segment_layer_rbsp() | VCL | |
4 | STSA_N | Coded slice segment of an STSA picture slice_segment_layer_rbsp() | VCL | |
5 | STSA_R | Coded slice segment of an STSA picture slice_segment_layer_rbsp() | VCL | |
6 | RADL_N | Coded slice segment of a RADL picture slice_segment_layer_rbsp() | VCL | |
7 | RADL_R | Coded slice segment of a RADL picture slice_segment_layer_rbsp() | VCL | |
8 | RASL_N | Coded slice segment of a RASL picture slice_segment_layer_rbsp() | VCL | |
9 | RASL_R | Coded slice segment of a RASL picture slice_segment_layer_rbsp() | VCL | |
10 | RSV_VCL_N10 | Reserved non - IRAP SLNR VCL NAL unit types | VCL | |
12 | RSV_VCL_N12 | Reserved non - IRAP SLNR VCL NAL unit types | VCL | |
14 | RSV_VCL_N14 | Reserved non - IRAP SLNR VCL NAL unit types | VCL | |
11 | RSV_VCL_R11 | Reserved non - IRAP sub - layer reference VCL NAL unit types | VCL | |
13 | RSV_VCL_R13 | Reserved non - IRAP sub - layer reference VCL NAL unit types | VCL | |
15 | RSV_VCL_R15 | Reserved non - IRAP sub - layer reference VCL NAL unit types | VCL | |
16 | BLA_W_LP | Coded slice segment of a BLA picture slice_segment_layer_rbsp() | VCL | |
17 | BLA_W_RADL | Coded slice segment of a BLA picture slice_segment_layer_rbsp() | VCL | |
18 | BLA_N_LP | Coded slice segment of a BLA picture slice_segment_layer_rbsp() | VCL | |
19 | IDR_W_RADL | Coded slice segment of an IDR picture slice_segment_layer_rbsp() | VCL | |
20 | IDR_N_LP | Coded slice segment of an IDR picture slice_segment_layer_rbsp() | VCL | |
21 | CRA_NUT | Coded slice segment of a CRA picture slice_segment_layer_rbsp() | VCL | |
22 | RSV_IRAP_VCL22 | Reserved IRAP VCL NAL unit types | VCL | |
23 | RSV_IRAP_VCL23 | Reserved IRAP VCL NAL unit types | VCL | |
24 - 31 | RSV_VCL24 - RSV_VCL31 | Reserved non - IRAP VCL NAL unit types | VCL | |
32 | VPS_NUT | Video parameter set video_parameter_set_rbsp() | non - VCL | |
33 | SPS_NUT | Sequence parameter set seq_parameter_set_rbsp() | non - VCL | |
34 | PPS_NUT | Picture parameter set pic_parameter_set_rbsp() | non - VCL | |
35 | AUD_NUT | Access unit delimiter access_unit_delimiter_rbsp() | non - VCL | |
36 | EOS_NUT | End of sequence end_of_seq_rbsp() | non - VCL | |
37 | EOB_NUT | End of bitstream end_of_bitstream_rbsp() | non - VCL | |
38 | FD_NUT | Filler data filler_data_rbsp() | non - VCL | |
39 | PREFIX_SEI_NUT | Supplemental enhancement information sei_rbsp() | non - VCL | |
40 | SUFFIX_SEI_NUT | Supplemental enhancement information sei_rbsp() | non - VCL | |
41 - 47 | RSV_NVCL41 - RSV_NVCL47 | Reserved | non - VCL | |
48 - 63 | UNSPEC48 - UNSPEC63 | Unspecified | VCL |
控制數據流
- VPS(視頻參數集)NALU的頭值為0x40(?六進制),取出2-7位(0x40 & 0x7E)>>1 =32(?進制)
- SPS(序列參數集)NALU的頭值為0x42(?六進制),取出2-7位(0x42 & 0x7E)>>1 =33(?進制)
- PPS(圖像參數集)NALU的頭值為0x44(?六進制),取出2-7位(0x44 & 0x7E)>>1 =34(?進制)
- SEI(補充增強信息)NALU的頭值為0x4e(?六進制),取出2-7位(0x4e & 0x7E)>>1 =39(?進制)
- I幀 NALU的頭值為0x26(?六進制),取出2-7位(0x26 & 0x7E)>>1 =19(?進制)
- I幀 NALU的頭值為0x28(?六進制),取出2-7位(0x28 & 0x7E)>>1 =20(?進制)
- P幀 NALU的頭值為0x02(?六進制),取出2-7位(0x02& 0x7E)>>1 =1(?進制)
- B幀 NALU的頭值為0x00(?六進制),取出2-7位(0x00& 0x7E)>>1 =0(?進制)
VPS、SPS、PPS:三者的結構和關系如下圖所示:
nuh_layer_id(6bit)
- LayerId預留位,占?NALU Header的第?個字節的最后?位和第?個字節的前五位,默認全為0,?于未來擴展。
nuh_temporal_id_plus1(3bit)
- TID時域層標號,占?NALU Header的第?個字節的最后三位,?般默認值為1,其值減1為該NALU時域層標號。
3.NALU Payload
NALU Payload 即視頻壓縮數據 RBSP,嚴格意義上來說,Payload 數據應該是 EBSP。
- SODB(String Of Data Bits):原始數據比特流,由 VCL 層產生的原始數據流,由于數據長度不一定是 8 的倍數,為方便計算機進行處理,就用到了 RBSP。
- RBSP(Raw Byte Sequence Payload):原始字節序列載荷,即在 SODB 的后面添加了 trailing bits,即一個 bit 1 和若干個 bit 0,以便字節對齊。
- EBSP (Encapsulated Byte Sequence Payload):擴展字節序列載荷。NALU 單元是通過開始碼 “0x00 0x00 0x00 0x01” 或者 “0x00 0x00 0x01” 來表示一個 NALU 單元的開始,同時 H265 規定,當檢測到 “0x00 0x00 0x00” 時,也可以表示當前 NALU 的結束。在 h265 碼流中規定每有兩個連續的 “0x00 0x00”,就增加一個 “0x03”,從而預防壓縮后的數據與開始碼產生沖突,防止競爭。
4 重點 NAL TYPE
參考博客:https://blog.csdn.net/Dillon2015/article/details/104142144
VPS 參數集
-
HEVC 在 H.264/AVC 的基礎上引入了視頻參數集 (Video Parameter Set,VPS)。
-
這樣 HEVC 共定義了 3 類參數集:視頻參數集 (Video Parameter Set,VPS);序列參數集 (SequenceParameter Set,SPS);圖像參數集 (Picture Parameter Set,SPS)。在一個 HEVC 碼流中,前三個 NALU 分別是 VPS NALU、SPS NALU、PPS NALU。這三類參數集的 NALU 可以獨立解碼而不需要參考碼流中其他 NALU。
-
每一類參數集都包含擴展機制,允許在將來的 HEVC 版本中擴展這個參數集而不會破壞向后兼容性。
-
VPS 用于傳送應用于多層和子層視頻編碼所需的信息,提供了整個視頻序列的全局性信息。一個給定的視頻序列的每一層都參考同一個 VPS,無論它們 SPS 是否相同。
VPS 語法元素
HEVC 中定義了 VPS 的各個語法元素及描述子:
video_parameter_set_rbsp( ) | Descriptor |
---|---|
vps_video_parameter_set_id | u(4) |
vps_base_layer_internal_flag | u(1) |
vps_base_layer_available_flag | u(1) |
vps_max_layers_minus1 | u(6) |
vps_max_sub_layers_minus1 | u(3) |
vps_temporal_id_nesting_flag | u(1) |
vps_reserved_0xffff_16bits | u(16) |
profile_tier_level( 1, vps_max_sub_layers_minusl ) | - |
vps_sub_layer_ordering_info_present_flag | u(1) |
for (i=( vps_sub_layer_ordering_info_present_flag? 0 : vps_max_sub_layers_minus1); i<= vps_max_sub_layers_minus1; i++ ) { } | - |
vps_max_dec_pic_buffering_minus1[i] | ue(v) |
vps_max_num_reorder_pics[i ] | ue(v) |
vps_max_latency_increase_plus1[i] | ue(v) |
vps_max_layer_id | u(6) |
vps_num_layer_sets_minus1 | ue(v) |
for (i=1 ; i<=vps_num_layer_sets_minus1; i++) | - |
for (j=0 ; j<= vps_max_layer_id; j++) | - |
layer_id_included_flag[i][j] | u(1) |
vps_timing_info_present_flag | u(1) |
if( vps_timing_info_present_flag) { } | - |
vps_num_units_in_tick | u(32) |
vps_time_scale | u(32) |
vps_poc_proportional_to_timing_flag | u(1) |
if( vps_poc_proportional_to_timing_flag ) | - |
vps_num_ticks_poc_diff_one_minus1 | ue(v) |
vps_num_hrd_parameters | ue(v) |
for (i=0 ; i<vps_num_hrd_parameters; i++){ } | - |
hrd_layer_set_idx[i (]) | ue(v) |
if ((i>0)) | - |
cprms_present_flag[i ] | u(1) |
hrd_parameters( cpms_present_flag[i ], vps_max_sub_layers_minusl) | - |
vps_extension_flag | u(1) |
if( vps_extension_flag ) | - |
while( more_rbsp_data( ) ) | - |
vps_extension_data_flag | u(1) |
rbsp_trailing_bits( ) | - |
上表定義了VPS的語法元素,前7條語法元素采?定?編碼,共4個字節,?便解碼器讀取,這7條語法元素包括VPS識別符,相關可?層及可?時域?層的信息。 |
跟隨前4個字節后的語法元素包括:比特流中解碼器工作的可用操作點信息。一個操作點的特性由使用的Profile、tier和level刻畫。它定義了解碼比特流所需的編碼工具,以及對比特流尺寸或緩存容量的限制。跟在整個比特流操作點指標后的是比特流時域子層的操作點指標。
-
vps_video_parameter_set_id:當前VPS標識符,供PPS引用。
-
vps_base_layer_internal_flag 和 vps_base_layer_available_flag:
- 如果vps_base_layer_internal_flag = 1且vps_base_layer_available_flag = 1,碼流中存在base layer。
- 否則,如果vps_base_layer_internal_flag = 0且vps_base_layer_available_flag = 1,base layer由本規范未規定的外部手段提供。
- 否則,如果vps_base_layer_internal_flag = 1且vps_base_layer_available_flag = 0,不存在base layer,但是VPS中包含base layer的信息就像其存在于碼流中一樣。
- 否則,如果vps_base_layer_internal_flag = 0且vps_base_layer_available_flag = 0,不存在base layer,但是VPS中包含base layer的信息就像其由本規范未規定的外部手段提供一樣。
-
vps_max_layers_minus1:該值加1表示參考這個VPS的CVS(Coded Video Sequence)的最多允許的層數。為了保持碼流的一致性,當vps_base_layer_internal_flag = 0時vps_max_layers_minus1應該大于0。在本規范中vps_max_layers_minus1應該小于63。vps_max_layers_minus1 = 63留給將來擴展使用。
-
vps_max_sub_layers_minus1:該值加1表示參考這個VPS的CVS的最多允許的時域子層數。vps_max_sub_layers_minus1 值應該在0~6間,即最多支持7個時域子層。
-
vps_temporal_id_nesting_flag:當vps_max_sub_layers_minus1 = 0時,該參數為1;當vps_max_sub_layers_minus1大于0時,這個參數用于指定是否對幀間預測進行額外限定。該參數用于指定時域子層升檔,即從低子層切換到高子層。
-
vps_reserved_0xffff_16bits:兩字節保留位,其值等于0xFFFF。
-
vps_sub_layer_ordering_info_present_flag:
-
vps_sub_layer_ordering_info_present_flag = 1表示vps_max_dec_pic_buffering_minus1[ i ],vps_max_num_reorder_pics[ i ] 和vps_max_latency _increase_plus1[ i ]作用于vps_max_sub_layers_minus1 + 1 子層。
-
vps_sub_layer_ordering_info _present_flag = 0表示vps_max_dec_pic_buffering_minus1[ vps_max_sub_layers_minus1 ],vps_max_num_reorder_pics[ vps_max_sub_layers_minus1 ]和vps_max_latency_increase_plus1[ vps_max_sub_layers_minus1 ] 作用于所有子層。
-
當vps_base_layer_internal_flag = 0時,vps_sub_layer_ordering_info _present_flag = 0且解碼器應該忽略該字段。
-
-
vps_max_dec_pic_buffering_minus1[ i ]:規定了HighestTid = i時,CVS的圖像存儲單元中解碼圖像所需的最大緩存。
-
vps_max_num_reorder_pics[ i ] :規定了HighestTid = i時,在CVS中解碼順序在某一幅圖像之后,而顯示順序在該圖像前的圖像最大數量。
-
vps_max_latency_increase_plus1[ i ] :當HighestTid = i時,該語法元素用于計算VpsMaxLatency Pictures[i]的值。當vps_max_latency_increase_plus1[ i ]不等于0時,VpsMaxLatencyPictures[ i ] =vps_max_num_reorder_pics[i]+vps_max_latency_increase_plus1[ i ]-1。
-
vps_max_layer_id:指定參考該VPS的所有CVS中的NALU的nuh_layer_id的最大值。
-
vps_num_layer_sets_minus1:指定VPS中層集(layer set)的數量,該值在0~1023間。
-
layer_id_included_flag[ i [ j] :
- 該語法元素為1時,表示圖層標識列表 LayerSetLayerIdList[ i ]中包含nuh_layer_id = j的情況;
- 該語法元素為0時,表示圖層標識列表 LayerSetLayerIdList[ i ]中不包含nuh_layer_id = j的情況;
- NumLayersInIdList[ 0 ] = 1且LayerSetLayerIdList[0][0] = 0,NumLayersInIdList[i]和 LayerSetLayerIdList[ i ]由下面方式生成:
n = 0
for(m = 0;m <= vps_max_layer_id;m++)if(layer_id_included_flag[i][m])LayerSetLayerIdList[i][n++] = m
NumLayersInIdList[i] = n
-
vps_timing_info_present_flag :
- 該語法元素為1時,表示在VPS中語法元素vps_num_units_in_tick、vps_time_scale、vps_poc_proportional_to_timing_flag和vps_num_hrd_parameters存在;
- 該語法元素為0時VPS中不存在這4個語法元素。
-
vps_num_units_in_tick:該語法元素規定當時鐘頻率為vps_time_scale Hz時所花的時間單位個數。以秒為單位時,一個時鐘周期等于vps_num_units_in_tick除以vps_time_scale 。例如,當一個視頻的幀率為25Hz時,vps_time_scale 等于27000000Hz,vps_num_units_in_tick就等于1080000,因此一個時鐘周期就是0.04秒。
-
vps_time_scale:一秒內時間單位的個數。
-
vps_poc_proportional_to_timing_flag:該語法元素為1時,表示CVS在每幅圖像(不包括第一幅圖像)的POC與它的顯示時間和第一幅圖像的顯示時間的比值成正比;否則,不成比例。
-
vps_num_ticks_poc_diff_one_minus1:表示POC之間差值為1時,時鐘周期的數目。
-
vps_num_hrd_parameters:指定VPS RBSP中語法結構體hrd_parameters()的數目。
-
hrd_layer_set_idx[ i ]:指定第i個語法結構體hrd_parameters()使用的圖層集的索引。
-
cprms_present_flag[ i ] :表示第i個hrd_parameters()中是否存在所有子層公用的HRD參數。
-
vps_extension_flag:該語法元素取0時,表示在VPS RBSP中沒有語法元素vps_extension_data_flag。
-
vps_extension_data_flag:可以為任意值。在該版本中,解碼器忽略該語法元素。
SPS參數集
參考博客:https://blog.csdn.net/Dillon2015/article/details/104148026
一段視頻包含一個或多個編碼視頻序列(CVS),每個CVS都有一個序列參數集(SPS),且這些SPS均引用同一個視頻參數集(VPS)。SPS包含CVS中所有編碼圖像的共享編碼參數,一個CVS內的所有圖像參數集(PPS)必須引用同一SPS,且SPS在被引用后直至CVS結束前均處于激活狀態。
SPS的語法元素主要分為以下七類:
1. 圖像格式信息
- 采樣格式:如4:2:0、4:2:2、4:4:4等色度采樣模式。
- 圖像分辨率:亮度分量的寬度(
pic_width_in_luma_samples
)和高度(pic_height_in_luma_samples
)。 - 量化深度:亮度(
bit_depth_luma_minus8
)和色度(bit_depth_chroma_minus8
)的比特深度(如8bit、10bit)。 - 裁剪參數:是否啟用裁剪(
conformance_window_flag
)及左/右/上/下偏移量(conf_win_left_offset
等)。
2. 編碼參數信息
- 塊尺寸設置:
- 編碼塊(CU)最小/最大尺寸(通過
log2_min_luma_coding_block_size_minus3
等參數推導)。 - 變換塊(TU)最小/最大尺寸及劃分深度(
log2_min_luma_transform_block_size_minus2
等)。
- 編碼塊(CU)最小/最大尺寸(通過
- 特殊模式開關:
- 4:4:4采樣的三通道單獨編碼(
separate_colour_plane_flag
)。 - 幀內強濾波(
strong_intra_smoothing_enabled_flag
)。 - 非對稱劃分模式(AMP,
amp_enabled_flag
)與時域MV預測(sps_temporal_mvp_enabled_flag
)。
- 4:4:4采樣的三通道單獨編碼(
- 編碼工具:量化矩陣使用(
scaling_list_enabled_flag
)、樣點自適應補償(SAO,sample_adaptive_offset_enabled_flag
)、PCM模式(pcm_enabled_flag
)及相關參數。
3. 參考圖像相關信息
- 短期參考圖像:短期參考圖像集合的數量及配置(
num_short_term_ref_pic_sets
)。 - 長期參考圖像:
- 長期參考圖像數目(
num_long_term_ref_pics_sps
)及其POC值(lt_ref_pic_poc_lsb_sps
)。 - 長期參考圖像是否可作為當前圖像參考的標志(
used_by_curr_pic_lt_sps_flag
)。
- 長期參考圖像數目(
4. profile、tier和level相關參數
- 檔次(Profile):如Main、Main 10、Main Still Picture。
- 層(Tier):主層(Main Tier)或高層(High Tier)。
- 級別(Level):限制分辨率、碼率等參數的等級(如Level 5.1支持4K分辨率)。
5. 時域分級信息
- 時域子層:最大子層數(
sps_max_sub_layers_minus1
,06,對應17層)。 - POC控制:通過
log2_max_pic_order_cnt_lsb_minus4
計算POC進位參數(MaxPicOrderCntLsb
)。 - 子層順序:子層順序標識開關(
sps_sub_layer_ordering_info_present_flag
)及緩存參數(如sps_max_dec_pic_buffering_minus1
)。
6. 可視化可用信息(VUI)
- 視頻寬高比、像素縱橫比、幀率信息。
- 安全區域、音頻參數、立體圖像格式等輔助解碼的元數據。
7. 其他信息
- 引用標識:引用的VPS編號(
sps_video_parameter_set_id
)。 - SPS標識:自身標識符(
sps_seq_parameter_set_id
,0~15)。 - 擴展信息:多層編碼擴展(
sps_multilayer_extension_flag
)、3D視頻擴展(sps_3d_extension_flag
)等未來預留字段。
下表是SPS的語法結構:
下表是SPS擴展部分語法結構:
下表是SPS在SCC擴展部分語法結構:
1. 基礎引用與標識參數
語法元素 | 描述 |
---|---|
sps_video_parameter_set_id | 指定當前激活的 VPS 的 ID 號。 |
sps_max_sub_layers_minus1 | 參考當前 SPS 的 CVS 的時域子層最大數目(取值 0~6,對應 1~7 個子層)。 |
sps_temporal_id_nesting_flag | - 當 sps_max_sub_layers_minus1 > 0 :控制幀間預測是否受時域子層限制。- 當 sps_max_sub_layers_minus1 = 0 :強制為 1。 |
sps_seq_parameter_set_id | SPS 自身標識號(0~15)。 |
2. 圖像格式參數
語法元素 | 描述 |
---|---|
chroma_format_idc | 色度采樣格式(0=mono,1=4:2:0,2=4:2:2,3=4:4:4)。 |
separate_colour_plane_flag | - 1:對 4:4:4 格式三通道單獨編碼 - 0:不單獨編碼(默認) |
pic_width_in_luma_samples | 解碼圖像亮度寬度(像素)。 |
pic_height_in_luma_samples | 解碼圖像亮度高度(像素)。 |
conformance_window_flag | - 1:啟用圖像裁剪 - 0:不裁剪 |
conf_win_left/right/top/bottom_offset | 裁剪偏移量(僅當 conformance_window_flag=1 時有效)。 |
bit_depth_luma_minus8 | 亮度像素比特深度(實際值 = 8 + 該值)。 |
bit_depth_chroma_minus8 | 色度像素比特深度(實際值 = 8 + 該值)。 |
3. POC 與時域控制參數
語法元素 | 描述 |
---|---|
log2_max_pic_order_cnt_lsb_minus4 | 計算 MaxPicOrderCntLsb = 2^(該值+4) ,用于 POC 進位控制。 |
sps_sub_layer_ordering_info_present_flag | - 1:參數作用于 sps_max_sub_layers_minus1+1 子層- 0:參數作用于所有子層 |
sps_max_dec_pic_buffering_minus1[i] | 當 HighestTid=i 時,解碼圖像緩存(DPB)的最大需求。 |
sps_max_num_reorder_pics[i] | 解碼順序在后、顯示順序在前的最大圖像數(范圍:[0, sps_max_dec_pic_buffering_minus1[i] ])。 |
sps_max_latency_increase_plus1[i] | 計算延遲圖像數:SpsMaxLatencyPictures[i] = 前值 + 該值 - 1 (非零時有效)。 |
4. 編碼塊與變換塊參數
語法元素 | 描述 |
---|---|
log2_min_luma_coding_block_size_minus3 | 亮度編碼塊(CU)最小尺寸(單位:2^(該值+3 ) 像素,如 0 對應 8x8)。 |
log2_diff_max_min_luma_coding_block_size | 亮度 CU 最大/最小尺寸差值(推導最大尺寸:最小尺寸 × 2^該值 )。 |
log2_min_luma_transform_block_size_minus2 | 亮度變換塊(TU)最小尺寸(單位:2^(該值+2 ) 像素,如 0 對應 4x4)。 |
log2_diff_max_min_luma_transform_block_size | 亮度 TU 最大/最小尺寸差值(推導最大尺寸:最小尺寸 × 2^該值 )。 |
max_transform_hierarchy_depth_inter | 幀間預測時 TU 最大劃分深度。 |
max_transform_hierarchy_depth_intra | 幀內預測時 TU 最大劃分深度。 |
5. 編碼工具與模式參數
語法元素 | 描述 |
---|---|
scaling_list_enabled_flag | - 1:使用量化矩陣 - 0:不使用 |
sps_scaling_list_data_present_flag | - 1:存在量化矩陣數據 - 0:不存在 |
amp_enabled_flag | - 1:啟用非對稱劃分模式(AMP) - 0:禁用 |
sample_adaptive_offset_enabled_flag | - 1:去塊濾波后啟用 SAO - 0:禁用 |
pcm_enabled_flag | - 1:啟用 PCM 無損編碼模式 - 0:禁用 |
6. PCM 模式參數
語法元素 | 描述 |
---|---|
pcm_sample_bit_depth_luma_minus1 | PCM 模式下亮度樣點比特深度(實際值 = 1 + 該值,如 0 對應 1bit)。 |
pcm_sample_bit_depth_chroma_minus1 | PCM 模式下色度樣點比特深度(實際值 = 1 + 該值)。 |
log2_min_pcm_luma_coding_block_size_minus3 | PCM 編碼塊最小尺寸(單位同 CU 尺寸參數)。 |
log2_diff_max_min_pcm_luma_coding_block_size | PCM 編碼塊最大/最小尺寸差值(推導方式同 CU 參數)。 |
pcm_loop_filter_disabled_flag | - 1:PCM 模式禁用環路濾波 - 0:啟用 |
7. 參考圖像參數
語法元素 | 描述 |
---|---|
num_short_term_ref_pic_sets | 短期參考圖像集合數目(0~64)。 |
long_term_ref_pics_present_flag | - 1:使用長期參考圖像 - 0:不使用 |
num_long_term_ref_pics_sps | 長期參考圖像數目(0~32)。 |
lt_ref_pic_poc_lsb_sps[i] | 第 i 個長期參考圖像的 POC 低位值(模 MaxPicOrderCntLsb )。 |
used_by_curr_pic_lt_sps_flag[i] | - 1:第 i 個長期參考圖像可用于當前圖像- 0:不可用 |
8. 擴展與預留參數
語法元素 | 描述 |
---|---|
sps_temporal_mvp_enabled_flag | - 1:非 IDR 圖像允許時域 MV 預測 - 0:禁止 |
strong_intra_smoothing_enabled_flag | - 1:啟用幀內濾波雙向線性插值 - 0:禁用 |
vui_parameters_present_flag | - 1:包含視頻可用信息(VUI) - 0:不包含 |
sps_extension_present_flag | - 1:存在擴展數據 - 0:無擴展 |
sps_range/multilayer/3d/scc_extension_flag | - 1:啟用對應擴展語法結構(當前版本多忽略)。 |
sps_extension_4bits | 預留字段(值恒為 0)。 |
sps_extension_data_flag | 擴展數據標志(解碼器忽略)。 |
PPS參數集
參考博客:https://blog.csdn.net/Dillon2015/article/details/104204039/
一幅圖像可以劃分為一個或多個片(SS, Slice Segment),同一幅圖像中的所有SS共用同一個圖像參數集(Picture Parameter Set, PPS)。PPS中包含與SPS相同的部分參數,并會覆蓋SPS中的對應值,即SS解碼時優先使用PPS中的參數。解碼初始時所有PPS均處于非激活狀態,任意時刻最多僅有一個PPS激活,且該PPS的作用域持續至當前圖像解碼結束。
PPS的語法元素可分為以下六類:
1. 編碼工具可用性標志
- 符號位隱藏(Sign Data Hiding):是否允許通過修改系數符號隱藏信息(
sign_data_hiding_enabled_flag
)。 - 幀內預測受限(Constrained Intra Prediction):是否禁止跨幀間預測塊的幀內預測(
constrained_intra_pred_flag
)。 - 去方塊濾波(Deblocking Filter):是否啟用去方塊濾波(
pps_deblocking_filter_disabled_flag
的反向控制)。 - 加權預測(Weighted Prediction):P/B幀是否啟用加權預測(
weighted_pred_flag
/weighted_bipred_flag
)。 - 環路濾波跨越邊界:是否允許濾波操作跨越片(Slice)或瓷磚(Tile)邊界(
pps_loop_filter_across_slices_enabled_flag
/loop_filter_across_tiles_enabled_flag
)。 - 變換跳過模式(Transform Skip/Bypass):是否允許跳過變換和量化(
transform_skip_enabled_flag
/transquant_bypass_enabled_flag
)。
2. 量化過程參數
- 初始QP值:亮度分量的初始量化參數(
init_qp_minus26
,實際QP = 26 + 該值)。 - 色度QP偏移:色度分量(Cb/Cr)相對于亮度的QP偏移量(
pps_cb_qp_offset
/pps_cr_qp_offset
,范圍:-12~12)。 - CU級QP調整:是否允許對CU的QP進行動態調整(
cu_qp_delta_enabled_flag
),涉及參數diff_cu_qp_delta_depth
(調整范圍深度)。
3. Tile劃分相關參數
- Tile模式開關:是否啟用Tile劃分(
tiles_enabled_flag
)。 - Tile布局參數:
- 總列數/行數:
num_tile_columns_minus1
(列數 = 該值 + 1)、num_tile_rows_minus1
(行數 = 該值 + 1)。 - 均勻分布標志:
uniform_spacing_flag
(1=等寬/等高,0=自定義)。 - 自定義尺寸:
column_width_minus1[i]
/row_height_minus1[i]
(非均勻分布時的列寬/行高)。
- 總列數/行數:
4. 去方塊濾波控制
- 濾波開關:全局禁用去方塊濾波標志(
pps_deblocking_filter_disabled_flag
,1=禁用,0=啟用)。 - 默認補償參數:
pps_beta_offset_div2
:亮度塊邊界補償值(beta)的偏移量(除以2,范圍:-6~6)。pps_tc_offset_div2
:色度塊邊界補償值(tC)的偏移量(除以2,范圍:-6~6)。
- 片級濾波覆蓋:是否允許片頭參數覆蓋PPS的濾波設置(
deblocking_filter_override_enabled_flag
)。
5. 片頭控制信息
- 依賴片標志:當前片是否為依賴片(
dependent_slice_segments_enabled_flag
)。 - 額外片頭比特:片頭中包含的額外控制比特數(
num_extra_slice_header_bits
,0~2位)。 - 解碼輸出順序:是否包含圖像輸出標志(
output_flag_present_flag
,影響解碼圖像的緩存和顯示順序)。 - CABAC初始化:是否指定上下文變量初始化方法(
cabac_init_present_flag
)。
6. 其他公用信息
- 標識參數:
pps_pic_parameter_set_id
:PPS自身ID(0~63)。pps_seq_parameter_set_id
:引用的SPS ID(對應sps_seq_parameter_set_id
)。
- 參考圖像數:
- P幀/B幀默認參考索引數(
num_ref_idx_l0_default_active_minus1
/num_ref_idx_l1_default_active_minus1
)。
- P幀/B幀默認參考索引數(
- 并行處理參數:合并模式候選列表的并行生成等級(
log2_parallel_merge_level_minus2
,影響運動矢量預測效率)。 - 變換矩陣覆蓋:是否存在覆蓋SPS的變換矩陣數據(
pps_scaling_list_data_present_flag
)。
PPS與SPS的關系
- 層級覆蓋:PPS參數優先級高于SPS,例如QP偏移、Tile劃分等圖像級參數優先使用PPS設置。
- 作用域:SPS作用于整個CVS(編碼視頻序列),而PPS僅作用于單幅圖像,支持動態調整編碼參數(如不同場景使用不同濾波或量化策略)。
通過PPS的靈活配置,H.265可針對單幅圖像優化編碼效率,平衡畫質與碼率,適應復雜場景的動態需求。
PPS語法元素詳解
1. 標識與引用參數
語法元素 | 描述 |
---|---|
pps_pic_parameter_set_id | PPS標識符(0~63),唯一標識一個PPS。 |
pps_seq_parameter_set_id | 引用的SPS的ID(0~15),指向關聯的序列參數集。 |
2. 片(Slice)控制參數
語法元素 | 描述 |
---|---|
dependent_slice_segments_enabled_flag | 判斷當前片段是否為依賴片(存在依賴關系的slice segment)。 |
output_flag_present_flag | 片頭部是否包含pic_output_flag ,影響圖像輸出順序和緩存管理。 |
num_extra_slice_header_bits | 片頭部額外比特數(0~2),預留未來擴展。 |
sign_data_hiding_enabled_flag | 是否允許符號位隱藏技術(用于數據隱藏或糾錯)。 |
cabac_init_present_flag | 是否存在CABAC初始化標志,控制熵編碼上下文初始化方式。 |
3. 參考圖像與預測參數
語法元素 | 描述 |
---|---|
num_ref_idx_l0_default_active_minus1 | P/B片默認參考索引數(L0方向,0~14)。 |
num_ref_idx_l1_default_active_minus1 | P/B片默認參考索引數(L1方向,0~14)。 |
weighted_pred_flag | P片是否啟用加權預測(1=啟用,0=禁用)。 |
weighted_bipred_flag | B片是否啟用雙向加權預測(1=啟用,0=禁用)。 |
4. 量化參數(QP)控制
語法元素 | 描述 |
---|---|
init_qp_minus26 | 亮度分量初始QP值(實際QP=26+該值,范圍:-26~25)。 |
cu_qp_delta_enabled_flag | 是否允許CU級QP調整(1=允許,0=禁止)。 |
diff_cu_qp_delta_depth | QP調整范圍深度,影響CTB與最小編碼塊的尺寸差。 |
pps_cb_qp_offset /pps_cr_qp_offset | 色度分量QP相對于亮度的偏移量(-12~12)。 |
pps_slice_chroma_qp_offsets_present_flag | 片頭部是否包含色度QP偏移參數。 |
5. 變換與濾波參數
語法元素 | 描述 |
---|---|
transform_skip_enabled_flag | 是否允許變換跳過模式(1=允許,0=禁止)。 |
transquant_bypass_enabled_flag | 是否允許跳過變換和濾波(1=允許,0=禁止)。 |
deblocking_filter_control_present_flag | 是否存在去方塊濾波控制信息。 |
pps_deblocking_filter_disabled_flag | 全局禁用去方塊濾波(1=禁用,0=啟用)。 |
pps_beta_offset_div2 /pps_tc_offset_div2 | 去方塊濾波補償參數(除以2,-6~6)。 |
6. Tile劃分參數
語法元素 | 描述 |
---|---|
tiles_enabled_flag | 是否啟用Tile劃分(1=啟用,0=單Tile)。 |
num_tile_columns_minus1 | Tile列數(列數=該值+1,范圍:0~PicWidthInCtbsY-1)。 |
num_tile_rows_minus1 | Tile行數(行數=該值+1,范圍:0~PicHeightInCtbsY-1)。 |
uniform_spacing_flag | Tile邊界是否均勻分布(1=均勻,0=自定義)。 |
column_width_minus1[i] | 第i列Tile寬度(CTB為單位,非均勻分布時有效)。 |
loop_filter_across_tiles_enabled_flag | 是否允許跨Tile邊界濾波(1=允許,0=禁止)。 |
7. 并行與擴展參數
語法元素 | 描述 |
---|---|
log2_parallel_merge_level_minus2 | 并行合并等級,影響運動矢量預測效率(取值:0~CtbLog2SizeY-2)。 |
pps_scaling_list_data_present_flag | 是否存在縮放矩陣(1=存在,覆蓋SPS中的矩陣)。 |
pps_extension_present_flag | 是否存在擴展語法元素(如多層編碼、3D擴展等)。 |
8. 熵編碼與同步參數
語法元素 | 描述 |
---|---|
entropy_coding_sync_enabled_flag | 是否啟用熵編碼同步機制(1=啟用,提高抗誤碼能力)。 |
lists_modification_present_flag | 片頭部是否包含參考圖像列表修改信息。 |
關鍵邏輯關系
- 參數覆蓋規則:PPS參數優先級高于SPS,例如QP偏移、Tile劃分等圖像級配置會覆蓋序列級設置。
- 作用域限制:PPS僅作用于單幅圖像,解碼完成后其激活狀態終止,下一幅圖像可引用不同PPS。
- 碼流一致性:同一CVS內的PPS需保持
tiles_enabled_flag
等全局參數一致,避免解碼沖突。
通過PPS的精細化控制,H.265能夠針對不同圖像特性動態調整編碼策略,在畫質、碼率和復雜度之間實現優化平衡。
檔次、層、級別
參考博客:https://blog.csdn.net/Dillon2015/article/details/104311186?fromshare=blogdetail&sharetype=blogdetail&sharerId=104311186&sharerefer=PC&sharesource=Antonio915&sharefrom=from_link
5. 檔次、層、級別
檔次(Profile)
檔次規定了編碼器可使用的編碼工具集,決定了碼流的基本特性。H.265定義了以下三種檔次:
檔次名稱 | 位深支持 | 采樣格式 | 典型應用場景 |
---|---|---|---|
Main | 8bit | 4:2:0 | 網絡流媒體、常規視頻存儲 |
Main 10 | 8bit/10bit | 4:2:0 | 高清廣播、專業視頻制作(如10bit HDR) |
Main Still Picture | - | - | 單幀圖像編碼(如相機快照、視頻截圖) |
特性說明:
- Main 10兼容性:支持Main 10的解碼器必須兼容Main檔次碼流。
- 靜止圖像:Main Still Picture基于Main檔次,僅編碼單幀,優化靜態場景壓縮效率。
層(Tier)
層是H.265新增的概念,用于區分碼流的性能需求,分為兩類:
層名稱 | 應用場景 | 典型支持級別 |
---|---|---|
主層(Main Tier) | 大多數常規應用(如1080p視頻) | Level 1 ~ Level 3.1 |
高層(High Tier) | 高負載場景(如4K/8K、高幀率視頻) | Level 4 ~ Level 6.2 |
關鍵區別:
- 高層支持更高的分辨率、碼率和采樣率,對解碼器性能要求更高。
級別(Level)
級別通過限制關鍵參數(如分辨率、碼率、緩存大小)確保解碼器兼容性,H.265定義了13個級別(1 ~ 6.2)。以下為部分級別關鍵參數對比:
級別 | 最大亮度圖像尺寸(像素) | 主層最大碼率(Mbps) | 高層最大碼率(Mbps) | 最小壓縮比 |
---|---|---|---|---|
1 | 36,864 | 0.128 | - | 2 |
2 | 122,880 | 1.5 | - | 2 |
3.1 | 983,040 | 10 | - | 2 |
4 | 2,228,224 | 12 | 30 | 4 |
5.1 | 8,912,896 | 40 | 160 | 8 |
6.2 | 35,651,584 | 240 | 4800 | 8 |
核心規則:
- 向下兼容:支持某一級別的解碼器可解碼低于該級別或同級別、同層的碼流。
- 參數限制:級別越高,允許的分辨率、碼率和壓縮比上限越高(如Level 6.2支持8K分辨率和4800 Mbps碼率)。
兼容性與應用建議
- 解碼器能力:
- 支持Main Tier的設備可處理Level 1~3.1的碼流(如手機、普通PC)。
- 支持High Tier的設備需額外處理Level 4+的高帶寬需求(如專業顯卡、8K播放器)。
- 編碼策略:
- 通用場景選擇Main Profile + 主層 + Level 3.1(適配多數設備)。
- 高清/超高清場景使用Main 10 Profile + 高層 + Level 5.1/6.2(需確認接收端支持)。
通過檔次、層、級別的組合,H.265實現了從低功耗設備到高端硬件的全場景覆蓋,平衡了編碼效率與設備兼容性。
三個檔次的關系如下圖:
層(Tier)和級別(Level)
H.265/HEVC定義了2個層和13個級別。2個層分別是Main Tier和High Tier。4和4以上的8個Level?持High Tier。下表給出了不同檔次和級別的語法元素:
Level | Max Luma Picture Size (samples) | Max Luma Sample Rate (samples/s) | Main Tier Max Bit Rate (1000 bits/s) | High Tier Max Bit Rate (1000 bits/s) | Min Comp. Ratio |
---|---|---|---|---|---|
1 | 36864 | 552960 | 128 | - | 2 |
2 | 122880 | 3686400 | 1500 | - | 2 |
2.1 | 245760 | 7372800 | 3000 | - | 2 |
3 | 552960 | 16588800 | 6000 | - | 2 |
3.1 | 983040 | 33177600 | 10000 | - | 2 |
4 | 2228224 | 66846720 | 12000 | 30000 | 4 |
4.1 | 2228224 | 133693440 | 20000 | 50000 | 4 |
5 | 8912896 | 267386880 | 25000 | 100000 | 6 |
5.1 | 8912896 | 534773760 | 40000 | 160000 | 8 |
5.2 | 8912896 | 1069547520 | 60000 | 240000 | 8 |
6 | 35651584 | 1069547520 | 60000 | 240000 | 8 |
6.1 | 35651584 | 2139095040 | 120000 | 480000 | 8 |
6.2 | 35651584 | 4278190080 | 240000 | 800000 | 8 |
語法元素
下?是H.265/HEVC中定義的檔次、層和級別的語法元素。
相關語法元素說明
- general_profile_space:取值固定為0,其他值預留作未來擴展用途。
- general_tier_flag:用于規定當前檔次中所使用層的具體內容。
- general_profile_idc:取值為0時,表示當前CVS(編碼視頻序列)編碼過程中所使用檔次的ID號 ,其他值留待未來擴展。
- general_profile_compatibility_flag[ j ] :當
general_profile_space
等于0時,該語法元素取值為1,意味著當前CVS編碼過程中使用的檔次ID號為j。 - general_progressive_source_flag和general_interlaced_source_flag:用于指定CVS的掃描方式,可表示逐行掃描、隔行掃描或者未明確指明掃描方式。
- general_non_packed_constraint_flag:用于指明CVS中是否存在frame packing arrangement SEI messages(幀封裝排列補充增強信息消息 )。
- general_frme_only_constraint_flag:用于指定
field_seq_flag
是否為0 。 - general_level_idc:用于指明CVS中所使用level(級別)的ID號 。
- sub_layer_profile_present_flag[ i ]:用于表明在TemporalId等于i的子層中,其
profile_tier_level( )
是否存在profile(檔次)信息 。 - sub_layer_level_present_flag[ i ]:用于表明在TemporalId等于i的子層中,其
profile_tier_level( )
是否存在level(級別)信息 。
H265數據示例
利?UItraEdit?具打開?個H265?件進?數據分析,如下圖所示:
如上圖所示,我們可以清晰的看到在H265碼流中,是以“0x00 0x00 x00 0x01”為開始碼的,找到開始碼后,后?的兩個字節表示NALU Header,上圖所示分別標注了VPS、SPS、PPS、IDR類型。