8.ffmpeg-基礎經常使用知識


1.封裝格式
MPEG-4
其中 MPEG-1 和 MPEG-2 是採用相同原理爲基礎的預測編碼、變換編碼、 熵編碼及運動補償等第一代數據壓縮編碼技術;
MPEG-4(ISO/IEC 14496)則是基於第二代壓縮編碼技術制定的國際標準,它以視聽媒體對象爲基本單元,採用基於內容的壓縮編碼,實現數字視音頻、圖形合成應用及交互式多媒體的集成。 MPEG 系列標準對 VCD、 DVD 等視聽消費電子及數字電視和高清晰度電視(DTV&&HDTV)、 多媒體通訊等信息產業的發展產生了巨大而深遠的影響.
AVI
AVI,音頻視頻交錯(Audio Video Interleaved)的英文縮寫。 AVI 格式調用方便、圖像質量好,壓縮標準可任意選擇,是應用最普遍、也是應用時間最長的格式之一。

FLV
FLV 是 FLASH VIDEO 的簡稱, FLV 流媒體格式是一種新的視頻格式。因爲它造成的文件極小、加載速度極快,使得網絡觀看視頻文件成爲可能,它的出現有效地解決了視頻文件導入 Flash 後,使導出的 SWF 文件體積龐大,不能在網絡上很好的使用等缺點。html


2.編碼格式
視頻部分
h26四、wmv、xvid、mjpeg(攝像頭出來的每一幀都是mjpeg,缺點在於只有I幀、沒有B幀、P幀)
音頻部分
acc、MP三、ape、flac

3.文件封裝格式和編碼格式數組

 

音頻幀和視頻幀的幀率是不一致的,好比音頻幀採樣率是44.1khz,聲音必須的源源不斷輸出,因此音頻幀率可能爲22.05幀,每一個幀裏存了2K採樣數據.

視頻解碼網絡

  • 軟件解碼:即經過軟件讓CPU來對視頻進行解碼處理,缺點耗電發熱,優勢兼容強
  • 硬件解碼:是將原來所有交由CPU(顯卡上的一個核心處理芯片,處理計算機中與圖形計算有關的工做)來處理的視頻數據的部分交由GPU來作,優勢不須要太好的CPU,發熱低,缺點起步較晚,沒法與軟解相提並論,兼容性不強.硬解碼都是固定幀率.好比只能60幀. 

音頻解碼ide

  • 將音頻碼流(aac、ape等)解碼成pcm


4.像素格式
壓縮編碼中通常使用的是RGB24,YUV420 , YUV420P, YUV422P, YUV444P等格式數據,最多見的是YUV420P.
RGB格式
BMP文件存儲的就是RGB格式像素數據
yuv格式
    y表示明亮度,而u(Cb 藍色色差值)v(Cr 紅色色差值)則表示色度值.它將亮度信息(Y)與色彩信息(UV)分離,沒有UV信息同樣能夠顯示完整的圖像,只不過是黑白的,因爲UV色度不是很明顯看出,因此除了YUV4:4:4外,又誕生了YUV4:2:2,YUV4:2:0格式.從而佔用極少的存儲數據.post

    以下圖所示,黑點表示該像素點的Y份量,以空心圓圈表示像素點的UV份量:學習

  • YUV444:每個Y對應一組UV份量,單位爲字節,因此每一個像素點有1個Y字節和1組(2字節,分別是U和V),因此爲3字節.
  • YUV422:每兩個Y共用一組UV份量,因此每一個每一個像素點有1個Y字節和1/2組UV(1字節),因此爲2字節.
  • YUV420:每四個Y共用一組UV份量,因此4個像素點爲5字節,每2個像素點爲2.5字節,因爲4個像素點是矩形構成的,爲了加快換算,因此每2個像素點共用3字節,每一個像素點爲1.5字節(12bit).

YUV420、YUV420P、YUV420SP區別ui

  • 對於YUV420格式(packed封裝),每一個像素點的Y,U,V是連續交*存儲的。因此存儲數據時,data[0]中就存的是yuvyuvyuv...
  • 對於YUV420P格式(planar平面封裝),先連續存儲全部像素點的Y,緊接着存儲全部像素點的U,隨後是全部像素點的V,好比:YYYYYYYY UU VV,因此Ffmpeg中存儲P格式數據時,data[0]數組存y,data[1]數組存u,data[2]數組存v
  • 對於YUV420SP格式(semi Planar半平面封裝),先連續存儲全部像素點的Y,而後連續存儲UV,好比:YYYYYYYY UVUV

5.YUV和RGB轉換格式編碼

RGB 轉換成 YUVspa

  • Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 
  • Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128 
  • Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128

YUV 轉換成 RGBcode

  • B = 1.164(Y - 16) + 2.018(U - 128) 
  • G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) 
  • R = 1.164(Y - 16) + 1.596(V - 128)

RGB取值範圍均爲0~255,Y=0~255,U=-122~+122,V=-157~+157
如下是通過簡化的公式,運算量比上述公式要小一些。
RGB轉YUV

  • Y = 0.299R + 0.587G + 0.114B 
  • U'= (BY)*0.565 
  • V'= (RY)*0.713

YUV轉RGB

  • R = Y + 1.403V' 
  • G = Y - 0.344U' - 0.714V' 
  • B = Y + 1.770U'

PS:除了軟解以外,則還能夠交給GPU進行硬解.

 

6.DTS、PTS、GOP

  • dts : 解碼時間戳
  • pts : 顯示時間戳
  • GOP : 一組完整的IBP幀畫面

而dts和pts值是不必定是相等的,以下圖GOP(Group of Picture)所示:

從上圖,能夠看到,DTS和PTS的順序是不一致的,而且每組GOP中開頭都是I幀,而後後面都是B、P幀,若是開頭的I幀圖像質量比較差時,也會影響到一個GOP中後續B、P幀的圖像質量.

  • I幀(intra picture) : 幀內編碼幀,它將全幀圖像信息進行 JPEG 壓縮編碼及傳輸,是一個完整圖像
  • B幀(bidirectional) : 雙向預測內插編碼幀,參考前面和後面兩幀的數據加上本幀的變化而得出的本幀數據
  • P幀 : 前向預測編碼幀,參考前面而得出的本幀數據.

通常平均來講, I 的壓縮率是 7(跟 JPG 差很少), P 是 20, B 能夠達到 50.

 

在ffmpeg中,pts和dts單位都是不肯定,若是要換算爲時分秒,則須要AVStream的time_base時基來一塊兒換算出當前顯示的標準時間
而time_base結構體爲AVRational:

因此計算時分秒爲:

if (frame->pts != AV_NOPTS_VALUE)    
    dpts = av_q2d(is->video_st->time_base) * frame->pts;

 


下章學習:9.下載ffmpeg、使QT支持同時編譯32位和64位

相關文章
相關標籤/搜索