走進音視訊的世界——音視訊解碼

2020-09-30 15:01:17

音視訊檔是經過編碼、封裝而成的。那麼反過來,要播放音視訊檔,首先得解封裝、解碼。上一篇部落格討論到音視訊編碼:https://blog.csdn.net/u011686167/article/details/108590762,我們來個上下呼應,本文與大家探討一下音視訊解碼。本質上,是按照既定的解碼協定去解析編碼內容,也就是編碼的逆過程。常見的視訊解碼器有:H264、H265、VP8、VP9、MPEG4、MJPEG、WMV3、MSMPEG4V3,常見的音訊解碼器有:MP3、AAC、FLAC、AC3、OPUS、VORBIS、AMR、WMA。

一、視訊解碼

1、pts與dts

dts:Decode Timestamp,解碼時間戳,決定什麼時候解碼該幀資料。

pts:Presentation Timestamp,顯示時間戳,決定什麼時候顯示該幀影象。以參考時鐘為基準,超前參考時鐘則等待,落後(在30ms與500ms之間)參考時鐘則快速渲染,十分落後(超過500ms)參考時鐘則丟棄該幀。參考時鐘分為三種:系統時鐘、音訊時鐘、視訊時鐘。一般以音訊時鐘作為參考時鐘,因為人類對聲音更加敏感,相對影象而言。

2、關鍵幀與非關鍵幀

關鍵幀:I幀為關鍵幀,所以I幀可以直接解碼還原出一個影象。

非關鍵幀:P幀與B幀為非關鍵幀,需要依賴關鍵幀才能解碼。而B幀是雙向預測幀,還要另外等待下一個I幀或P幀,才可以成功解碼出來。B幀壓縮率比較高,但是編解碼複雜度也相對高。

3、組包與拼幀

有些封裝格式會把一幀資料拆成若干包,比如wmv格式,因為關鍵幀資料可能比較大;RTP封裝資料時,也會把一幀拆成若干包,因為MTU規定網路層最大傳輸單元為1500bytes。因此,在解封裝或者接收網路封包時,需要根據序號排列,把若干個包組成一個完整包,然後再解碼。例如FFmpeg讀取一幀資料過程,原始碼在avformat/utils.c中,如下圖所示(參考雷神部落格):

                                                    圖1—FFmpeg 讀幀資料過程 

4、特定幀頭

在解析h264/h265編碼的視訊幀時,需要在幀頭新增起始碼,一般起始碼為0x00 0x00 0x01或者0x00 0x00 0x00 0x01。比如mp4封裝格式,一般是以h264為視訊編碼、aac為音訊編碼。

二、音訊解碼

1、planar與packed儲存

planar:每個聲道資料單獨儲存。以立體聲道為例,L表示左聲道,R表示右聲道。那麼儲存格式為LLLLRRRR。在FFmpeg中,第i個聲道資料儲存在frame->data[i]。類似視訊的畫素格式YUV420P,Y、U、V三個分量單獨儲存,4個Y分量對應一個U分量與一個V分量。

packed:所有聲道資料交錯儲存。同樣地,以立體聲道資料為例。那麼儲存格式為LRLRLRLR。在FFmpeg中,所有聲道資料都儲存在frame->data[0]。類似視訊的YUV420SP,Y獨立儲存,UV交錯儲存,4個Y分量對應一組UV分量。

2、量化位數

量化位數:量化位是對模擬音訊訊號的幅度軸數位化,它決定了模擬訊號數位化的動態範圍。量化位數越大,品質越好。bitsPerSample,佔2bytes,一般為8bits、16bits、32bits、64bits。在WAVE的Format chunk有定義,如下表所示:

長度內容說明
ckID4Chunk ID: "fmt ",FOURCC四位元組碼,注意最後一個填充是空格。
cksize4Chunk size: 16 or 18 or 40
nChannels2Number of interleaved channels,聲道數(交織儲存)
nSamplesPerSec4Sampling rate (blocks per second),音訊取樣率
nAvgBytesPerSec4Average bytes rate,音訊平均位元速率
nBlockAlign2Data block size (bytes),音訊資料塊大小(單位位元組)
wBitsPerSample2Bits per sample,量化位數(比如8bits、16bits、32bit
cbSize2Size of the extension (0 or 22),擴充套件欄位長度
wValidBitsPerSample2Number of valid bits,有效的位長度
dwChannelMask4Speaker position mask,聲道描述掩碼
SubFormat16GUID, including the data format code

                                                    表1—Format chunk結構


       3、取樣率

音訊取樣率是指錄音裝置在1秒時間內對聲音訊號的取樣次數,取樣頻率越高,那麼聲音的還原越真實自然。常見的取樣率有8000Hz、16000Hz、32000Hz、44100Hz、48000Hz。其中44100Hz可達到CD音質標準,也是目前最為常用的取樣率。

4、聲道數與聲道佈局

常見聲道數有:單聲道、立體聲道、3聲道、4聲道、5聲道、6聲道、7聲道、8聲道。其中3聲道以上,又稱為立體環繞聲道,其中杜比音效就是採用多聲道同時輸出,實現立體環繞效果。

聲道佈局的各個聲道描述如下:

   FC: front center
   BC: back center
   FL/FR: front left/right
   FCL/FCR: front center left/right
   FTL/FTR: front top left/right
   SL/SR: back surround left/right
   BL/BR: back left/right
   LFE: low frequency effects

聲道數與聲道佈局關係,如下表所示:

聲道數聲道佈局描述
1mono<FC>
2stereo(FL, FR)
33.0<FC>, (FL, FR)
44.0<FC>, (FL, FR), <BC>
55.0<FC>, (FL, FR), (SL, SR)
65.1<FC>, (FL, FR), (SL, SR), <BC>, [LFE]
76.1<FC>, (FL, FR), (SL, SR), <RC>, [LFE]
87.1<FC>, (FCL, FCR), (FL, FR), (SL, SR), [LFE]

                                                          表2—聲道數與聲道佈局關係