術語:
容器(Container):容器就是一種文件格式,比如flv,mkv等。包含下面5種流以及文件頭信息。
流(Stream):是一種視頻數據信息的傳輸方式,5種流:音頻,視頻,字幕,附件,數據。
幀(Frame):幀代表一幅靜止的圖像,分爲I幀,P幀,B幀。(下文介紹)
編解碼器(Codec):是對視頻進行壓縮或者解壓縮的工具。
複用(mux):把不同的流按照某種容器的規則放入容器。
解複用(demux):把不同的流從某種容器中解析出來。
視頻編碼方式
硬編碼:使用非CPU進行編碼,如顯卡GPU、專用的DSP、FPGA、ASIC芯片等
軟編碼:使用CPU進行編碼,軟編碼通常使用:ffmpeg+x264
編碼的流程:
採集--> 獲取到視頻幀--> 對視頻幀進行編碼 --> 獲取到視頻幀信息 --> 將編碼後的數據以NALU方式寫入到文件
視頻編碼協議:
H. 264:低碼率,高質量,高容錯 。(編碼單位固定16*16)開源實現:ffmpeg、openh264、x264。
H. 265:能達到H.264兩倍之壓縮率,可支持4k分辨率,最高到8k。(編碼單位8*8-64*64)開源實現:ffmpeg、libde265、x265。
二者比較:H.265更爲先進,同樣畫質的情況下,265理論存儲空間節省50%,同樣碼率下,265理論畫質提高30%-40%。
視頻編解碼開源實現:
ffmpeg:是一套開源的、用於對音視頻進行編碼&解碼&轉化計算機程序
x264:x264是一種免費的、開源的、具有更優秀算法的H.264/MPEG-4 AVC視頻壓縮編碼方式
視頻單位:
幀率:每秒鐘多少幀畫面
碼率:單位時間內保存的數據量
GOP:group of pictures 一組I幀爲首的序列,後面跟着P幀或B幀。
GOP Size:兩個I幀之間的間隔,例如:GOP爲120,如果是720p 幀率60 的話,那就是2s一次I幀.
視頻編碼中的幀:
I幀:表示關鍵幀,你可以理解爲這一幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因爲包含完整畫面)
P幀:表示的是這一幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據)
B幀:是雙向差別幀,也就是B幀記錄的是本幀與前後幀的差別(具體比較複雜,有4種情況),換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之後的畫面,通過前後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累~。
DTS和PTS:
DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在於告訴播放器該在什麼時候解碼這一幀的數據。
PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什麼時候顯示這一幀的數據。
圖像存儲格式:
RGB:使用紅、綠、藍三原色的亮度來定量表示顏色。
BGR:與RGB一樣,B與R對調。
YUV:Y表示亮度,CbCr表示顏色。