音視訊檔是經過編碼、封裝而成的。那麼反過來,要播放音視訊檔,首先得解封裝、解碼。上一篇部落格討論到音視訊編碼: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有定義,如下表所示:
域 | 長度 | 內容說明 |
---|---|---|
ckID | 4 | Chunk ID: "fmt ",FOURCC四位元組碼,注意最後一個填充是空格。 |
cksize | 4 | Chunk size: 16 or 18 or 40 |
nChannels | 2 | Number of interleaved channels,聲道數(交織儲存) |
nSamplesPerSec | 4 | Sampling rate (blocks per second),音訊取樣率 |
nAvgBytesPerSec | 4 | Average bytes rate,音訊平均位元速率 |
nBlockAlign | 2 | Data block size (bytes),音訊資料塊大小(單位位元組) |
wBitsPerSample | 2 | Bits per sample,量化位數(比如8bits、16bits、32bit |
cbSize | 2 | Size of the extension (0 or 22),擴充套件欄位長度 |
wValidBitsPerSample | 2 | Number of valid bits,有效的位長度 |
dwChannelMask | 4 | Speaker position mask,聲道描述掩碼 |
SubFormat | 16 | GUID, 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
聲道數與聲道佈局關係,如下表所示:
聲道數 | 聲道佈局 | 描述 |
1 | mono | <FC> |
2 | stereo | (FL, FR) |
3 | 3.0 | <FC>, (FL, FR) |
4 | 4.0 | <FC>, (FL, FR), <BC> |
5 | 5.0 | <FC>, (FL, FR), (SL, SR) |
6 | 5.1 | <FC>, (FL, FR), (SL, SR), <BC>, [LFE] |
7 | 6.1 | <FC>, (FL, FR), (SL, SR), <RC>, [LFE] |
8 | 7.1 | <FC>, (FCL, FCR), (FL, FR), (SL, SR), [LFE] |
表2—聲道數與聲道佈局關係