H.266/VVC技術學習57:視頻屬性雜談(2)

雜談部分主要講講自己初學時不懂的,而且是過了好久好久才理解的內容(心痛啊)。這裏做一個簡要的記錄及痛心的會議,比較面向還沒入門的同學,希望會有所幫助吧。

前一期視頻屬性雜談 我們討論了視頻的構成要素,也知道了顯示在屏幕上的視頻,是像素值是由yuv按序排列形成並通過SDL播放。這一期我們向上層進發,瞭解一下.yuv是怎麼形成的,進而瞭解一下我們電腦裏常有的.mp4、.avi等等視頻文件是如何播放出來的,並且對碼流文件的組成也初步認識一下。

1 yuv文件的形成

終於涉及到專業相關了哈哈哈哈哈。看了上一篇雜談最後的計算環節,有沒有感覺一個yuv太大了呢?一個高清電影就佔了1T硬盤?事實上並非如此,我們不會用yuv來存放視頻文件,而常見的.MP4和yuv的關係,將會在讀完本博後得以瞭解。

1.1 引子

我們的電腦裏經常會存放.mp4、.avi、.mkv、.flv、.ts等等常見的視頻文件。
西部世界S03要上演了,回味一下。我呢,用potplayer打開了西部世界S01E01,右鍵點屬性,看到了播放信息如下圖。
在這裏插入圖片描述
首先我們看到了解碼器都是ffmpeg,這是個大殺器,裏面有完整的將.mp4轉換爲.yuv的過程。

1.1 從.mp4到.bin

我們看到了,這個.mp4實際上就是把視頻信息和音頻信息封裝了起來。我們看的視頻文件,實際上是兩部分:沒有聲音的畫面以及聲音。這兩部分封裝類似於一個壓縮包。上圖文件封裝了HEVC編碼的視頻、AC3編碼的音頻。

對於音頻,就是本科DSP種學過的,把聲波做時域採樣(頻率一般是44100Hz?),多聲道會多幾次採樣,採樣位數應該是量化相關,然後去除編碼冗餘,即進行熵編碼。由於我對音頻研究幾乎爲0,就不多說啦,如果這部分有問題請大家指出~

下面我們主要說前者,視頻信息部分:編碼的視頻碼流。

1.2 從.bin到.yuv

前兩句說到HEVC編碼的碼流,可能還會有一些懵逼。但要說,它可以叫做.bin文件,是不是有點熟悉了呢?是的,它就是一個二進制碼流文件,.bin文件存了很多0和1,把這些01放進編好的解碼器裏就會生成視頻像素數據.yuv,但這個.bin文件比.yuv是小了成百上千倍,可見視頻編碼的威力啦。我們用字節級16進制的方法來一睹.bin文件的真容:
在這裏插入圖片描述

說到這裏,很多同學,尤其是實驗室的同學應該就很熟悉了!從.bin到.yuv就是解碼操作啊,運行個VTM8.0解碼端就是做了個這啊!

這部分內容就是專業性比較強的視頻編解碼算法的內容,包含幀內預測、幀間預測、變換量化、熵編碼、環路濾波等技術。博主的其他博客基本都是這方面相關的技術,有興趣可以查閱。

綜上,借雷神的圖,可表示如下:
在這裏插入圖片描述

2 碼流.bin文件的組成

這部分,有些偏離屬性主題了,但對於做編碼的初學者可以瞭解一下~ 跳過也不影響太多理解的。

下面要深入一下我們常見的.bin文件。這東西一看嚇一跳啊,這部分內容如需深究請查閱JVET-Q2001裏面的表格部分,這裏只作單純的框架理解。

2.1 .bin = PSD + (StartCodePrefix +NALU) x N

PSD:Parameter Set Data,表示參數級數據
NALU:Network Abstract Layer Unit

一個碼流文件首先確定視頻的通用參數PSD,佔一小部分。其餘部分分成N個NALU來存儲,每個NALU前面會有一個標記,即開始碼StartCodePrefix,每遇到一個開始碼錶示開始了一個NALU。

在H.264種,一般一幀就是一個NALU,在H.265有所放開,有多種分組方式,如有興趣瞭解,請看萬老師書P289。

2.2 NALU = NALU header + NALU payload

NALU header:即NALU頭,長度爲固定的2字節,反映NALU的內容特徵。
NALU payload:即NALU載荷長度,爲整數字節,承載視頻壓縮後的比特流片段,也就是編碼出的主體內容。但比特流形成NALU payload的過程,需要經過整數字節化和衝突避免

2.3 NALU payload ≈ RBSP

RBSP:Raw Byte Sequence Payload,原始字節序列載荷。
經過沖突避免後的RBSP可以作爲NALU的載荷信息。

其實RBSP就是

2.4 RBSP = SODB + RBSP trailing bits

SODB:String Of Data Bits,比特流——這其實才是最純粹最真誠的碼流。
RBSP trailing bits:RBSP尾比特

SODB只需要從左到右、從上到下解析即可。內部存的東西就是我們預測變換濾波等,經過熵編碼輸出出去的二進制。
RBSP尾由稱爲RBSP停止比特的一個比特1和其後的零個或多個比特0組成。

因此RBSP就是整數字節化的SODB,就是說SODB這一堆01,最終佔位並非整數字節。而NALU payload需要整數字節,因此要將其整數字節化,隨後衝突避免即可。

2.5 SODB:這裏纔是我們一直做的!

2.6 小結

綜上,從.bin文件到真實解碼的碼流SODB,需要進行一個較複雜的過程。首先要在碼流文件中獲取NALU,隨後轉化爲RBSP,進而獲取真實裸流進行解碼形成yuv。

可粗略理解如下:

.bin = PSD + startCodePrefix + naluHeader + SODB + rbspTrailingBits 
		   + startCodePrefix + naluHeader + SODB + rbspTrailingBits 
		   + startCodePrefix + naluHeader + SODB + rbspTrailingBits 
		   + ...

3 視頻信息相關

上面說了那麼多,估計這波都走偏了,以上主要從.mp4入手說了兩條路徑:
1、把.mp4到.bin到每一個二進制碼字介紹了一遍,反過來就是編碼到封裝的過程。
2、把.mp4到.bin到.yuv最終到電腦屏幕這一過程作爲暗線,介紹瞭解碼及播放的原理。

但既然說的是視頻的屬性,當然還是要說說視頻信息內容。那麼就繼續以這個視頻介紹:
在這裏插入圖片描述
上面這張圖是不是暴露了些什麼。。。啊這都不是重點,我們來一一分析。
概要部分呢都是常見的信息,我們以視頻信息爲重點來談:

1、Format:就是編解碼格式,這裏是HEVC(HighE ficiency Video Codng),是H.265的,應該說是比較新的了。

2、Fornat _Profile:就是視頻的檔次,這裏是Main10,支持10比特深度,像素的顏色更多些,色彩更加細緻。比特深度相關概念見下7。

3、BitRate:就是比特率。2783kbps表示每秒需要傳輸2783千比特,即需要2.7M/S的網速纔可以無損傳輸此視頻,當然視頻播放的過程中幀率會有較大的變化,如畫面不穩定,色彩較豔麗等情況。

4、FrameRate:就是幀率,這裏是每秒要傳輸23.976幀,且恆定。其實在視頻的播放過程中,幀率是不斷變化的,這裏的恆定指變化比較輕微。

5、ColorSpace:就是色彩空間,這裏的YUV在前一期雜談已經提過。

6、ChromaSubsampling:就是色度下采樣的模式,這裏的4:2:0在前一期雜談也已經提過。

7、Bitdepth:就是比特深度,8比特深度表示Y、U、V三個分量都有28個顏色等級,取值[0,255]。同理10比特深度即10個顏色等級,取值[0,1023]。

8、Bits/(pixel*frame) :就是數據密度,視頻每1幀圖像中1單位像素所分配到的平均碼流,在視頻編碼中一般叫bpp,和碼率控制相關。

9、BT.709:是一種色彩標準,基本是視頻上可以看到的最好的色彩了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章