H264編碼系列之profile & level控制

更多音視頻知識(shí)請(qǐng)點(diǎn)擊點(diǎn)擊獲取更多音視頻知識(shí)

Sequence Paramater Set(SPS)(序列參數(shù)集)

(1). profile_idc:

標(biāo)識(shí)當(dāng)前H.264碼流的profile。我們知道,H.264中定義了三種常用的檔次profile:

  • 基準(zhǔn)檔次:baseline profile;
  • 主要檔次:main profile;
  • 擴(kuò)展檔次:extended profile;

在H.264的SPS中,第一個(gè)字節(jié)表示profile_idc,根據(jù)profile_idc的值可以確定碼流符合哪一種檔次。判斷規(guī)律為:

  • profile_idc = 66 → baseline profile;
  • profile_idc = 77 → main profile;
  • profile_idc = 88 → extended profile;

在新版的標(biāo)準(zhǔn)中,還包括了High、High 10、High 4:2:2、High 4:4:4、High 10 Intra、High 4:2:2 Intra、High 4:4:4 Intra、CAVLC 4:4:4 Intra等,每一種都由不同的profile_idc表示。

另外,constraint_set0_flag ~ constraint_set5_flag是在編碼的檔次方面對(duì)碼流增加的其他一些額外限制性條件。

在我們實(shí)驗(yàn)碼流中,profile_idc = 0x42 = 66,因此碼流的檔次為baseline profile。

(2). level_idc

標(biāo)識(shí)當(dāng)前碼流的Level。編碼的Level定義了某種條件下的最大視頻分辨率、最大視頻幀率等參數(shù),碼流所遵從的level由level_idc指定。

當(dāng)前碼流中,level_idc = 0x1e = 30,因此碼流的級(jí)別為3。

(3). seq_parameter_set_id

表示當(dāng)前的序列參數(shù)集的id。通過(guò)該id值,圖像參數(shù)集pps可以引用其代表的sps中的參數(shù)。

(4). log2_max_frame_num_minus4

用于計(jì)算MaxFrameNum的值。計(jì)算公式為MaxFrameNum = 2^(log2_max_frame_num_minus4 + 4)。MaxFrameNum是frame_num的上限值,frame_num是圖像序號(hào)的一種表示方法,在幀間編碼中常用作一種參考幀標(biāo)記的手段。

(5). pic_order_cnt_type

表示解碼picture order count(POC)的方法。POC是另一種計(jì)量圖像序號(hào)的方式,與frame_num有著不同的計(jì)算方法。該語(yǔ)法元素的取值為0、1或2。

(6). log2_max_pic_order_cnt_lsb_minus4

用于計(jì)算MaxPicOrderCntLsb的值,該值表示POC的上限。計(jì)算方法為MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)。

(7). max_num_ref_frames

用于表示參考幀的最大數(shù)目。

(8). gaps_in_frame_num_value_allowed_flag

標(biāo)識(shí)位,說(shuō)明frame_num中是否允許不連續(xù)的值。

(9). pic_width_in_mbs_minus1

本句法元素加 1 后指明圖像寬度,以宏塊為單位:

PicWidthInMbs = pic_width_in_mbs_minus1 + 1

通過(guò)這個(gè)句法元素解碼器可以計(jì)算得到亮度分量以像素為單位的圖像寬度:

PicWidthInSamplesL = PicWidthInMbs * 16

從而也可以得到色度分量以像素為單位的圖像寬度:

PicWidthInSamplesC = PicWidthInMbs * 8

以上變量 PicWidthInSamplesL、PicWidthInSamplesC 分別表示圖像的亮度、色度分量以像素為單位的寬。

H.264 將圖像的大小在序列參數(shù)集中定義,意味著可以在通信過(guò)程中隨著序列參數(shù)集動(dòng)態(tài)地改變圖像的大小,在后文中可以看到,甚至可以將傳送的圖像剪裁后輸出。

(10). pic_height_in_map_units_minus1

本句法元素加 1 后指明圖像高度:

PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1
PicSizeInMapUnits = PicWidthInMbs * PicHeightInMapUnits

圖像的高度的計(jì)算要比寬度的計(jì)算復(fù)雜,因?yàn)橐粋€(gè)圖像可以是幀也可以是場(chǎng),從這個(gè)句法元素可以在幀模式和場(chǎng)模式下分別計(jì)算出出亮度、色度的高。值得注意的是,這里以 map_unit 為單位,map_unit的含義由后文敘述。

(11). frame_mbs_only_flag

標(biāo)識(shí)位,說(shuō)明宏塊的編碼方式。當(dāng)該標(biāo)識(shí)位為0時(shí),宏塊可能為幀編碼或場(chǎng)編碼;該標(biāo)識(shí)位為1時(shí),所有宏塊都采用幀編碼。根據(jù)該標(biāo)識(shí)位取值不同,PicHeightInMapUnits的含義也不同,為0時(shí)表示一場(chǎng)數(shù)據(jù)按宏塊計(jì)算的高度,為1時(shí)表示一幀數(shù)據(jù)按宏塊計(jì)算的高度。

按照宏塊計(jì)算的圖像實(shí)際高度FrameHeightInMbs的計(jì)算方法為:

FrameHeightInMbs = ( 2 ? frame_mbs_only_flag ) * PicHeightInMapUnits

(12). mb_adaptive_frame_field_flag

標(biāo)識(shí)位,說(shuō)明是否采用了宏塊級(jí)的幀場(chǎng)自適應(yīng)編碼。當(dāng)該標(biāo)識(shí)位為0時(shí),不存在幀編碼和場(chǎng)編碼之間的切換;當(dāng)標(biāo)識(shí)位為1時(shí),宏塊可能在幀編碼和場(chǎng)編碼模式之間進(jìn)行選擇。

(13). direct_8x8_inference_flag

標(biāo)識(shí)位,用于B_Skip、B_Direct模式運(yùn)動(dòng)矢量的推導(dǎo)計(jì)算。

(14). frame_cropping_flag

標(biāo)識(shí)位,說(shuō)明是否需要對(duì)輸出的圖像幀進(jìn)行裁剪。

(15). vui_parameters_present_flag

標(biāo)識(shí)位,說(shuō)明SPS中是否存在VUI信息。

H264編碼profile & level控制

H.264有四種畫(huà)質(zhì)級(jí)別,分別是baseline, extended, main, high:

  1. Baseline Profile:基本畫(huà)質(zhì)。支持I/P 幀,只支持無(wú)交錯(cuò)(Progressive)和CAVLC;
  2. Extended profile:進(jìn)階畫(huà)質(zhì)。支持I/P/B/SP/SI 幀,只支持無(wú)交錯(cuò)(Progressive)和CAVLC;(用的少)
  3. Main profile:主流畫(huà)質(zhì)。提供I/P/B 幀,支持無(wú)交錯(cuò)(Progressive)和交錯(cuò)(Interlaced), 也支持CAVLC 和CABAC 的支持;
  4. High profile:高級(jí)畫(huà)質(zhì)。在main Profile 的基礎(chǔ)上增加了8x8內(nèi)部預(yù)測(cè)、自定義量化、 無(wú)損視頻編碼和更多的YUV 格式;

H.264 Baseline profile、Extended profile和Main profile都是針對(duì)8位樣本數(shù)據(jù)、4:2:0格式(YUV)的視頻序列。在相同配置情況下,High profile(HP)可以比Main profile(MP)降低10%的碼率。 根據(jù)應(yīng)用領(lǐng)域的不同:

  • Baseline profile多應(yīng)用于實(shí)時(shí)通信領(lǐng)域;
  • Main profile多應(yīng)用于流媒體領(lǐng)域;
  • High profile則多應(yīng)用于廣電和存儲(chǔ)領(lǐng)域。

profile主要參數(shù)

下圖清楚的給出不同的profile&level的性能區(qū)別。


不同profile支持的參數(shù)特性

Level 主要參數(shù)

不同Level對(duì)應(yīng)的特性

ffmpeg如何控制profile&level

舉3個(gè)例子:

ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output_baseline_30.h264
ffmpeg -i input.mp4 -profile:v main -level 4.2 output_main_42.h264
ffmpeg -i input.mp4 -profile:v high -level 5.1 output_high_51.h264

轉(zhuǎn)碼后用mediainfo進(jìn)行分析

  • output_baseline_30.h264 baseline對(duì)應(yīng)profile_idc = 66,level對(duì)應(yīng)level_idc=30。
    output_baseline_30.h264
  • output_main_42.h264 baseline對(duì)應(yīng)profile_idc = 77,level對(duì)應(yīng)level_idc=42。
    output_main_42
  • output_high_51.h264 baseline對(duì)應(yīng)profile_idc = 100,level對(duì)應(yīng)level_idc=51。
    output_high_51

如果ffmpeg編譯時(shí)加了external的libx264,那就這么寫(xiě):

ffmpeg -i input.mp4 -c:v libx264 -x264-params "profile=high:level=3.0" output.mp4

通常情況下壓縮比例來(lái)說(shuō),baseline< main < high,對(duì)于帶寬比較局限的在線視頻,可能會(huì)選擇high,但有些時(shí)候,做個(gè)小視頻,希望所有的設(shè)備基本都能解碼(有些低端設(shè)備或早期的設(shè)備只能解碼 baseline),那就犧牲文件大小吧,用baseline!
不同profile和level壓縮后的文件大小對(duì)比
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容