ffmpeg 音視頻處理入門基礎概念

目錄

ffmpeg概念

術語

播放原理

碼流 kb/s

採樣率 Hz

比特率  bps

幀速率

I、P、B 幀

GOP

DTS、PTS 的概念

視頻轉換流程解析

流拷貝

ffmpeg濾鏡(Filters, filterchains,filtergraphs)


ffmpeg概念

    Fmpeg的名稱來自MPEG視頻編碼標準,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。可以輕易地實現多種視頻格式之間的相互轉換

組成

    1、ffmpeg:是一個命令行工具,用來對視頻文件轉換格式,也支持對電視卡實時編碼

    2、libavformat:用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能,包含demuxers和muxer庫;

    3、libavcodec:用於各種類型聲音/圖像編解碼;

    4、libavfilter:濾鏡庫

    5、libavutil:包含一些公共的工具函數;

    6、libswscale:用於視頻場景比例縮放、色彩映射轉換;

    7、libpostproc:用於後期效果處理;

    8、ffsever:是一個HTTP多媒體實時廣播流服務器,支持時光平移;

    9、ffplay:是一個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;(一般編譯完沒有帶ffplay,新版本版本依賴於sdl-2.0,需要安裝sdl-2.0才能生成ffplay)

術語

    容器(Container)容器就是一種文件格式,比如flv,mkv等。包含下面5種流以及文件頭信息。

    流(Stream)是一種視頻數據信息的傳輸方式,5種流:音頻(a)、附件(t)、數據(d)、字幕(s)和視頻(v)。

    幀(Frame)幀代表一幅靜止的圖像,分爲I幀,P幀,B幀。

    編解碼器(Codec)是對視頻進行壓縮或者解壓縮,CODEC =COde (編碼) +DECode(解碼)

    複用/解複用(mux/demux)把不同的流按照某種容器的規則放入容器,這種行爲叫做複用(mux)把不同的流從某種容器中解析出來,這種行爲叫做解複用(demux);  

播放原理

    封裝格式作用:視頻碼流和音頻碼流按照一定的格式儲存在一個文件彙總

    視頻編碼數據作用:將視頻像素數據(RGB,YUV等)壓縮成爲視頻碼流,從而降低視頻的數據量

    音頻編碼數據作用:將音頻採樣數據(PCM等)壓縮成爲音頻碼流,從而降低音頻的數據量

    視頻像素數據作用:保存了屏幕上每一個像素點的像素值格式:常見的像素數據格式有RGB24, RGB32, YUV420P,YUV422P,YUV444P等。

    壓縮編碼中一般使用的是YUV格式的像素數據,最爲常見的格式爲YUV420P。特點:視頻像素數據體積很大

    音頻採樣數據作用:保存了音頻中每個採樣點的值。特點:音頻採樣數據體積很大

碼流 kb/s

碼流(Data Rate)是指視頻圖像經過編碼壓縮後在單位時間內的數據流量,也叫碼率,一般我們用的單位是kb/s或者Mb/s。是視頻編碼中畫面質量控制中最重要的部分。同樣分辨率下,壓縮比越小,視頻圖像的碼率就越大,畫面質量就越高,文件體積也越大

其計算公式是文件體積=時間X碼率/8。

採樣率 Hz

採樣率(也稱爲採樣速度或者採樣頻率)定義了每秒從連續信號中提取並組成離散信號的採樣個數,它用赫茲(Hz)來表示。採樣率是指將模擬信號轉換成數字信號時的採樣頻率,也就是單位時間內採樣多少點。一個採樣點數據有多少個比特

比特率  bps

 比特率是指每秒傳送的比特(bit)數。單位爲bps(BitPer Second),比特率越高,傳送的數據越大。比特率表示經過編碼(壓縮)後的音、視頻數據每秒鐘需要用多少個比特來表示,而比特就是二進制裏面最小的單位,要麼是0,要麼是1。比特率與音、視頻壓縮的關係,簡單的說就是比特率越高,音、視頻的質量就越好,但編碼後的文件就越大;如果比特率越少則情況剛好相反。比特率是指將數字聲音、視頻由模擬格式轉化成數字格式的採樣率,採樣率越高,還原後的音質、畫質就越好。

比特率是決定整體音頻或視頻質量的參數。 它規定了每時間單位處理的位數,在FFmpeg中,位速率以每秒位數表示比特率決定了存儲1秒編碼流的位數

比特率 =採樣率 x 採用位數 x聲道數.

VBR(Variable Bitrate)動態比特率 也就是沒有固定的比特率,壓縮軟件在壓縮時根據音頻數據即時確定使用什麼比特率,這是以質量爲前提兼顧文件大小的方式,推薦編碼模式;

ABR(Average Bitrate)平均比特率是VBR的一種插值參數。LAME針對CBR不佳的文件體積比和VBR生成文件大小不定的特點獨創了這種編碼模式。ABR在指定的文件大小內,以每50幀(30幀約1秒)爲一段,低頻和不敏感頻率使用相對低的流量,高頻和大動態表現時使用高流量,可以做爲VBR和CBR的一種折衷選擇。

CBR(Constant Bitrate),常數比特率 指文件從頭到尾都是一種位速率。相對於VBR和ABR來講,它壓縮出來的文件體積很大,而且音質相對於VBR和ABR不會有明顯的提高。

幀速率

    幀速率是編碼成視頻文件的每秒幀數(FPS或fps),人眼需要至少約15 fps來觀看連續運動。 幀率也稱爲幀頻,其單位是赫茲(Hz),LCD顯示器通常具有60 Hz的頻率。有兩種幀速率 - 隔行(在FPS編號後表示爲i)和逐行(在FPS編號後表示爲p)。越高的幀速率可以得到更流暢、更逼真的動畫。每秒鐘幀數(FPS)越多,所顯示的動作就會越流暢。

IPB

在視頻編碼序列中,主要有三種編碼幀:I幀、P幀、B幀,如下圖所示。

● I幀即Intra-coded picture(幀內編碼圖像幀),不參考其他圖像幀,只利用本幀的信息進行編碼

● P幀即Predictive-codedPicture(預測編碼圖像幀),利用之前的I幀或P幀,採用運動預測的方式進行幀間預測編碼

● B幀即Bidirectionallypredicted picture(雙向預測編碼圖像幀),提供最高的壓縮比,它既需要之前的圖像幀(I幀或P幀),也需要後來的圖像幀(P幀),採用運動預測的方式進行幀間雙向預測編碼

在視頻編碼序列中,GOP即Group of picture(圖像組),指兩個I幀之間的距離,Reference(參考週期)指兩個P幀之間的距離(如下圖3.1)。一個I幀所佔用的字節數大於一個P幀,一個P幀所佔用的字節數大於一個B幀(如下圖所示)。

I 幀、P 幀、B 幀的區別在於:

I 幀(Intracoded frames):I 幀圖像採用幀內編碼方式,即只利用了單幀圖像內的空間相關性,而沒有利用時間相關性。I 幀使用幀內壓縮,不使用運動補償,由於 I 幀不依賴其它幀,所以是隨機存取的入點,同時是解碼的基準幀。I 幀主要用於接收機的初始化和信道的獲取,以及節目的切換和插入,I 幀圖像的壓縮倍數相對較低。I 幀圖像是週期性出現在圖像序列中的,出現頻率可由編碼器選擇。

P 幀(Predictedframes):P 幀和 B 幀圖像採用幀間編碼方式,即同時利用了空間和時間上的相關性。P 幀圖像只採用前向時間預測,可以提高壓縮效率和圖像質量。P 幀圖像中可以包含幀內編碼的部分,即 P 幀中的每一個宏塊可以是前向預測,也可以是幀內編碼。

B 幀(Bi-directionalpredicted frames):B 幀圖像採用雙向時間預測,可以大大提高壓縮倍數。值得注意的是,由於 B 幀圖像採用了未來幀作爲參考,因此 MPEG-2 編碼碼流中圖像幀的傳輸順序和顯示順序是不同的。

也就是說,一個 I 幀可以不依賴其他幀就解碼出一幅完整的圖像,而 P 幀、B 幀不行。P 幀需要依賴視頻流中排在它前面的幀才能解碼出圖像。B 幀則需要依賴視頻流中排在它前面或後面的幀才能解碼出圖像。

三種幀的說明 

1、I幀 

I幀:幀內編碼幀 ,I幀表示關鍵幀,你可以理解爲這一幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因爲包含完整畫面) 

I幀特點: 

1)  它是一個全幀壓縮編碼幀。它將全幀圖像信息進行JPEG壓縮編碼及傳輸; 

2)  解碼時僅用I幀的數據就可重構完整圖像; 

3)  I幀描述了圖像背景和運動主體的詳情; 

4)  I幀不需要參考其他畫面而生成; 

5)  I幀是P幀和B幀的參考幀(其質量直接影響到同組中以後各幀的質量); 

6)  I幀是幀組GOP的基礎幀(第一幀),在一組中只有一個I幀; 

7)  I幀不需要考慮運動矢量; 

8)  I幀所佔數據的信息量比較大。 

2、P幀 

P幀:前向預測編碼幀。P幀表示的是這一幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據) 

P幀的預測與重構:P幀是以I幀爲參考幀,在I幀中找出P幀“某點”的預測值和運動矢量,取預測差值和運動矢量一起傳送。在接收端根據運動矢量從I幀中找出P幀“某點”的預測值並與差值相加以得到P幀“某點”樣值,從而可得到完整的P幀。 

P幀特點: 

1)  P幀是I幀後面相隔1~2幀的編碼幀; 

2)  P幀採用運動補償的方法傳送它與前面的I或P幀的差值及運動矢量(預測誤差); 

3)  解碼時必須將I幀中的預測值與預測誤差求和後才能重構完整的P幀圖像; 

4)  P幀屬於前向預測的幀間編碼。它只參考前面最靠近它的I幀或P幀; 

5)  P幀可以是其後面P幀的參考幀,也可以是其前後的B幀的參考幀; 

6)  由於P幀是參考幀,它可能造成解碼錯誤的擴散; 

7)  由於是差值傳送,P幀的壓縮比較高。 

3、B幀 

B幀:雙向預測內插編碼幀。B幀是雙向差別幀,也就是B幀記錄的是本幀與前後幀的差別(具體比較複雜,有4種情況,但我這樣說簡單些),換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之後的畫面,通過前後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累。 

B幀的預測與重構 

B幀以前面的I或P幀和後面的P幀爲參考幀,“找出”B幀“某點”的預測值和兩個運動矢量,並取預測差值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中“找出(算出)”預測值並與差值求和,得到B幀“某點”樣值,從而可得到完整的B幀。 

B幀特點 

1)B幀是由前面的I或P幀和後面的P幀來進行預測的; 

2)B幀傳送的是它與前面的I或P幀和後面的P幀之間的預測誤差及運動矢量; 

3)B幀是雙向預測編碼幀; 

4)B幀壓縮比最高,因爲它只反映丙參考幀間運動主體的變化情況,預測比較準確; 

5)B幀不是參考幀,不會造成解碼錯誤的擴散。 

GOP

GOP即Group of picture(圖像組),指兩個I幀之間的距離,Reference(參考週期)指兩個P幀之間的距離。一個I幀所佔用的字節數大於一個P幀,一個P幀所佔用的字節數大於一個B幀。所以在碼率不變的前提下,GOP值越大,P、B幀的數量會越多,平均每個I、P、B幀所佔用的字節數就越多,也就更容易獲取較好的圖像質量;Reference越大,B幀的數量越多,同理也更容易獲得較好的圖像質量。需要說明的是,通過提高GOP值來提高圖像質量是有限度的,在遇到場景切換的情況時,H.264編碼器會自動強制插入一個I幀,此時實際的GOP值被縮短了。另一方面,在一個GOP中,P、B幀是由I幀預測得到的,當I幀的圖像質量比較差時,會影響到一個GOP中後續P、B幀的圖像質量,直到下一個GOP開始纔有可能得以恢復,所以GOP值也不宜設置過大。同時,由於P、B幀的複雜度大於I幀,所以過多的P、B幀會影響編碼效率,使編碼效率降低。另外,過長的GOP還會影響Seek操作的響應速度,由於P、B幀是由前面的I或P幀預測得到的,所以Seek操作需要直接定位,解碼某一個P或B幀時,需要先解碼得到本GOP內的I幀及之前的N個預測幀纔可以,GOP值越長,需要解碼的預測幀就越多,seek響應的時間也越長。

“在H264的概念中有一個幀稱爲IDR幀”

“那麼IDR幀與I幀的區別是什麼呢?首先來看一下IDR的英文全稱instantaneous decoding refresh picture,因爲H264採用了多幀預測,所以I幀之後的P幀有可能會參考I幀之前的幀,這就使得在隨機訪問的時候不能以找到I幀作爲參考條件,因爲即使找到I幀,I幀之後的幀還是有可能解析不出來,而IDR幀就是一種特殊的I幀,即這一幀之後的所有參考幀只會參考到這個IDR幀,而不會再參考前面的幀。在解碼器中,一旦收到一個IDR幀,就會立即清理參考幀緩衝區,並將IDR幀作爲被參考的幀。”

DTSPTS 的概念

DTS、PTS 的概念如下所述:

DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在於告訴播放器該在什麼時候解碼這一幀的數據。

PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什麼時候顯示這一幀的數據。

需要注意的是:雖然 DTS、PTS 是用於指導播放端的行爲,但它們是在編碼的時候由編碼器生成的。

當視頻流中沒有 B 幀時,通常 DTS 和 PTS 的順序是一致的。但如果有 B 幀時,就回到了我們前面說的問題:解碼順序和播放順序不一致了。

比如一個視頻中,幀的顯示順序是:I B B P,現在我們需要在解碼 B 幀時知道 P 幀中信息,因此這幾幀在視頻流中的順序可能是:I P B B,這時候就體現出每幀都有 DTS 和 PTS 的作用了。DTS 告訴我們該按什麼順序解碼這幾幀圖像,PTS 告訴我們該按什麼順序顯示這幾幀圖像。順序大概如下:

PTS: 1 4 2 3

DTS: 1 2 3 4

Stream: I P B B

音視頻的同步

上面說了視頻幀、DTS、PTS 相關的概念。我們都知道在一個媒體流中,除了視頻以外,通常還包括音頻。音頻的播放,也有 DTS、PTS 的概念,但是音頻沒有類似視頻中 B 幀,不需要雙向預測,所以音頻幀的 DTS、PTS 順序是一致的。

音頻視頻混合在一起播放,就呈現了我們常常看到的廣義的視頻。在音視頻一起播放的時候,我們通常需要面臨一個問題:怎麼去同步它們,以免出現畫不對聲的情況。

要實現音視頻同步,通常需要選擇一個參考時鐘,參考時鐘上的時間是線性遞增的,編碼音視頻流時依據參考時鐘上的時間給每幀數據打上時間戳。在播放時,讀取數據幀上的時間戳,同時參考當前參考時鐘上的時間來安排播放。這裏的說的時間戳就是我們前面說的 PTS。實踐中,我們可以選擇:同步視頻到音頻、同步音頻到視頻、同步音頻和視頻到外部時鐘。

PAR —— Pixel Aspect Ratio 像素橫縱比。表示每個像素的寬度與長度的比值。可以認爲每個像素不是正方形的。

DAR —— Display Aspect Ratio 顯示橫縱比。最終顯示的圖像在長度單位上的橫縱比。

SAR —— Sample Aspect Ratio 採樣橫縱比。表示橫向的像素點數和縱向的像素點數的比值。

視頻轉換流程解析

    代碼轉換過程中,ffmpeg在libavformat庫中調用demuxers來讀取輸入,並從數據包中獲取編碼數據。如果有更多的輸入,ffmpeg可以通過跟蹤任何活動輸入流的最低時間戳來保持它們的同步。然後解碼器從編碼的數據包中生成未壓縮的幀,在可選的過濾後,幀被髮送到編碼器。編碼器產生新的編碼包,它被髮送到muxer並寫入到輸出。

 

流拷貝

    流拷貝是對指定數據流僅僅進行復制,這種情況下不會進行編碼解碼,僅僅是分離和混合數據包,所以特別快,也不會造成質量損失,這也導致這種模式不適用複雜的濾鏡處理等,這種模式常用於文件包格式或者修改部分元數據信息。

ffmpeg濾鏡(Filters, filterchains,filtergraphs)

濾鏡(Filters):在編碼前,對原音視頻使用libavfilter庫中的濾鏡進行處理,FFmpeg內置了許多多媒體過濾器,可以通過多種方式組合它們。

分爲兩種濾鏡:簡單濾鏡和複合濾鏡

簡單濾鏡:

簡單濾鏡就是隻有1個輸入和輸出的濾鏡,使用-vf和-af分別對應視頻和音頻

複合濾鏡:

複合濾鏡就是那些不能簡單的描述爲一個線性處理過程應用到一個流的情況,例如包含多個輸入輸出。

複合濾鏡使用-filter_complex進行設置

濾鏡的使用一般是 濾鏡名=由於冒號(:)隔開各個參數

濾鏡鏈圖(filtergraphs)是連接濾鏡的有向圖,它可以包含循環動作,也可以在多個濾鏡間形成鏈路,每個鏈接都有一個連接到濾鏡的輸入和一個連接到濾鏡的輸出

一個濾鏡鏈(filterchains)包含序列鏈接起來的濾鏡,這個序列由“,"分隔各個濾鏡

一個濾鏡鏈圖(filtergraphs)包含序列濾鏡鏈,這個序列由“;”分隔各個濾鏡鏈

同一路的濾鏡間用逗號(,)進行分割,不同路的濾鏡間用分號進行分割(;)

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