更多音視頻知識(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:
- Baseline Profile:基本畫(huà)質(zhì)。支持I/P 幀,只支持無(wú)交錯(cuò)(Progressive)和CAVLC;
- Extended profile:進(jìn)階畫(huà)質(zhì)。支持I/P/B/SP/SI 幀,只支持無(wú)交錯(cuò)(Progressive)和CAVLC;(用的少)
- Main profile:主流畫(huà)質(zhì)。提供I/P/B 幀,支持無(wú)交錯(cuò)(Progressive)和交錯(cuò)(Interlaced), 也支持CAVLC 和CABAC 的支持;
- 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ū)別。

Level 主要參數(shù)

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!


