1、概念
在
H.264
流中,有兩種
NALU
極其重要,H264碼流可以分為兩層,VCL層和NAL層,NAL的全稱是Network abstraction layer,叫網絡抽象層,它儲存了H264相關的參數資訊和圖像資訊,NAL層由多個單元NALU組成,NALU由了NALU頭(00 00 00 01或者00 00 01)、sps(序列參數集)、pps(圖像參數集合)、slice、sei、IDR幀、I幀(在圖像運動變化較少時,I幀後面是7個P幀,如果圖像運動變化大時,一個序列就短了,I幀後面可能是3個或者4個P幀)、P幀、B幀等資料。
2、sps、pps、I幀、P幀在NALU中的關系和nalu type判斷
一個完整的NALU單元結構圖如下:
3、序列參數集 (Sequence Paramater Set, SPS
)
SPS
SPS 記錄了編碼的
Profile
、
level
、圖像寬高等
3.1、profile 主要參數:
- 1、Baseline Profile:基本畫質。支援I/P 幀,隻支援無交錯(Progressive)和CAVLC;
- 2、Extended profile:進階畫質。支援I/P/B/SP/SI 幀,隻支援無交錯(Progressive)和CAVLC;(用的少)
- 3、Main profile:主流畫質。提供I/P/B 幀,支援無交錯(Progressive)和交錯(Interlaced), 也支援CAVLC 和CABAC 的支援;
- 4、High profile:進階畫質。在main Profile 的基礎上增加了8x8内部預測、自定義量化、 無損視訊編碼和更多的YUV 格式;
H.264 Baseline profile、Extended profile和Main profile都是針對8位樣本資料、4:2:0格式(YUV)的視訊序列。在相同配置情況下,High profile(HP)可以比Main profile(MP)降低10%的碼率。 根據應用領域的不同,Baseline profile多應用于實時通信領域,Main profile多應用于流媒體領域,High profile則多應用于廣電和存儲領域。
3.2、Level 主要參數:
3.3、fmpeg如何控制profile&level
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4
ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4
ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4
如果ffmpeg編譯時加了external的libx264,那就這麼寫:
ffmpeg -i input.mp4 -c:v libx264 -x264-params "profile=high:level=3.0" output.mp4
從壓縮比例來說,baseline< main < high ,對于帶寬比較局限的線上視訊,可能會選擇high,但有些時候,做個小視訊,希望所有的裝置基本都能解碼(有些低端裝置或早期的裝置隻能解碼baseline),那就犧牲檔案大小吧,用baseline。自己取舍吧!
4、圖像參數集 (Picture Paramater Set, PPS
)
PPS
每一幀編碼後資料所依賴的參數儲存于
PPS
中
一般情況
SPS
和
PPS
的
NAL Unit
通常位于整個碼流的起始位置。
封裝檔案一般進儲存一次,位于檔案頭部,
SPS/PPS
在整個解碼過程中複用,不發生變化。
然而對于實時流,通常是從流中間開始解碼,是以需要在每個
I幀
前添加
SPS
和
PPS
;
如果編碼器在編碼過程中改變了碼流參數(如分辨率),需要重新調整
SPS
和
PPS
資料。