视频压缩编码 gop(Group of Pictures)(I帧间隔)的概念、IDR、I帧(关键帧,intra picture)、P帧、B帧、帧内压缩、帧间压缩、pts(显示时间)、dts(解码时间)
文章目錄
- 前言:
- 關于視頻的基礎定義
- GOP:Group of Pictures
- 壓縮(也就是編碼)
- 幀內壓縮:自己本身壓縮,不參考其他的幀。
- 幀間壓縮:參考其他視頻幀壓縮。
- 解碼(解壓縮)
- 為什么好多人說GOP是兩個I幀的間隔?
- I幀:關鍵幀,intra picture
- IDR幀:Instantaneous Decoding Refresh
- P幀:Predictive Picture(預測編碼圖像幀)
- B幀:Bidirectionally predicted picture(雙向預測編碼圖像幀)
- 幀率:
- 碼流:或者稱為碼率,只針對視頻數據,單位時間內視頻數據量大小,一般以秒為單位(KB/S)(碼率是通過什么算法控制的 ?)
- 結尾
- 0928更新GOP拉大和GOP拉長的問題(實際情況需要自己判斷)
前言:
最近看到一句話,
“GOP在一定程度上會影響視頻畫面質量 - 在碼率相同的情況下,GOP越大,意味著P\B幀越多,也就更容易獲取較好的圖像質量”
然后回顧了一下目前了解的視頻知識,發現怎么都想不明白這句話。
關于視頻的基礎定義
這里先科普下視頻編碼、解碼、GOP、IDR幀、I幀、P幀、B幀、幀率、碼流的基本定義。
GOP:Group of Pictures
顧名思義,就是一組圖片,在實際操作中,就是一組完整的視頻幀,怎么叫做完整的視頻幀?也就是說一個GOP拿出來,必須能夠完整的播放、顯示。
那GOP就可以推斷出來,必須是以I幀開頭,這樣后面的P幀和B幀才能跟據前向參考幀進行解碼顯示。
這樣也就能理解,為什么GOP是I幀的間隔,從當前這個I幀開始,到下一個I幀結束(一?這里先放個問號)。
看圖,從這個I幀開始到下個I幀之前,就是一個GOP:
圖A
壓縮(也就是編碼)
這里我把壓縮和編碼當作同一回事,視頻實際上就是一張張圖片連續的播放,就像小人書一樣,圖片連續播放,里面的畫面就好像動起來一樣。
視頻自然不能直接把一張張圖片保存或者傳輸,會浪費很多存儲、導致傳輸過程中,帶寬壓力特別大。
這里就需要把圖片進行壓縮,也就是編碼。將一張張圖片數據編碼成視頻幀,視頻幀就是一張張的圖片壓縮之后得到的。
壓縮分為幀內壓縮和幀間壓縮。
幀內壓縮:自己本身壓縮,不參考其他的幀。
舉個壓縮的例子,100 000,這個數字大家讀的時候,肯定不是一零零零零零零,大家會讀做10萬或者100K,我們會把后面三個0壓縮。
幀間壓縮:參考其他視頻幀壓縮。
再舉個 ,1 000 000,上面那個 ,我們讀做1000K,我們也可以讀做10個100K。當然這只是示例,實際的幀間壓縮不可能這么簡單。
對于幀間壓縮來說,可以這樣理解,找不同(大家一起來找茬,這個都玩過),
比如記錄一個秒表的走動的視頻,秒表的背景是固定的,走動的只有秒表的數字或者指針,那么我們在I幀某保存一刻秒表的完整圖像,然后在下一刻只需要保存跟I幀中不同的部分,相同的部分只需要告訴播放器(解碼器),除了這一部分,其他部分跟參考幀的視頻數據相同。
這樣壓縮之后,這個視頻幀解碼就需要參考前面那一個參考幀的數據,這就是幀間壓縮。
解碼(解壓縮)
圖B
如圖,純粹是為了理解參考幀和解碼順序(與實際有差別)。
- 2號P幀參考幀是1號I幀,也就是說,解碼器需要根據1號I幀的內容,才能還原2號P幀的圖像。
- 4號B幀參考幀是3號和5號,那么視頻幀頭里面參考幀標志會告訴解碼器,需要先解碼3號幀和5號幀。接下來解碼器會將參考幀3號和5號放入參考幀序列,然后再去解碼4號幀。(5號幀是參考的誰的?)
- 可以看下8號幀,理解下它和6、7、9、10、11的解碼數據。
- 回到問題一,GOP是兩個I幀的間隔。從這里說,一個GOP就是1-10號幀,但是10號幀還參考了11號幀,那就違反了GOP是一組完整的圖片的定義。所以嚴格意義上講GOP必須是以IDR幀開始,到下一個IDR幀結束,一個GOP的所有視頻幀的參考幀必須在GOP之中。
視頻幀頭信息里面還會有pts和dts,pts代表顯示時間,dts代表解碼時間,這里的時間類似順序,越大,順序越靠后。
為什么好多人說GOP是兩個I幀的間隔?
對于直播來說,不會有B幀存在,就類似圖A,只有I幀和P幀的區別。
原因:直播的實時性要求決定了它不能一個幀到來的時候還要等待它后面的幀才能解碼。
I幀:關鍵幀,intra picture
寫個單詞,顯得專業。
I幀就是采取幀間壓縮的視頻幀,它可以單獨被解碼成一張完整的圖片。那么如果某個視頻都是I幀,那么一個I幀就是一個GOP。當然一般情況下都不會這樣做。
IDR幀:Instantaneous Decoding Refresh
及時解碼刷新。我一般稱它為immediate refresh ,立刻刷新,IDR幀必須是一個I幀,但是I幀不一定是IDR幀,這個幀出現的時候,是告訴解碼器,可以清除掉所有的參考幀,這是一個全新的序列,新的GOP已經開始。
P幀:Predictive Picture(預測編碼圖像幀)
會參考之前的I幀或者P幀,采用運動預測的方式進行幀間編碼。
B幀:Bidirectionally predicted picture(雙向預測編碼圖像幀)
雙向預測,從名字就可以看出,它需要進行雙向參考,也就是兩個參考幀,一個在它的前面,一個在它的后面,這就是它跟P幀的區別,多了一個參考幀,當然壓縮率也會比P幀高。
幀率:
剛才提到,視頻其實就是一張張圖片連續播放。
那么就涉及到一個問題,一秒鐘播放多少張圖片?也就是一秒鐘多少個數據幀,這個數字就是幀率。
日常使用中,我目前見到的固定幀率的情況比較多,比如市面上一些智能攝像頭之類的。
碼流:或者稱為碼率,只針對視頻數據,單位時間內視頻數據量大小,一般以秒為單位(KB/S)(碼率是通過什么算法控制的 ?)
碼率=視頻數據大小/視頻時間長度。
對于直播之類的計算,碼流=視頻傳輸數據量/傳輸時間。
在直播中,兩種方式計算的碼流應該是近似相等的,否則就會出現類似延時,卡頓等情況。
結尾
“GOP在一定程度上會影響視頻畫面質量 -
在碼率相同的情況下,GOP越大,意味著P\B幀越多,也就更容易獲取較好的圖像質量”
筆者看到了多次類似的話,細想總覺得有很多迷惑的地方。
首先,P/B幀的數量多少,只影響畫面流暢度,不影響圖像還原度和清晰度。
其次,碼率固定情況下,P/B越多,那就意味著單位時間內,P/B的大小更小(碼率=單位時間內所有幀數據的大小之和),
P和B越小,意味著壓縮率更高,雖然視頻會更加流暢,但是圖像質量也就是圖像還原度會更低。
在這種情況下,說容易獲得較好的圖像質量好像有點牽強,畢竟人眼通常情況下超過24幀的幀率之后,就不會感覺到畫面卡頓。
幀率固定的情況下(這種情況下,我們可以視為碼流和GOP大小成正比例關系),GOP大小會影響畫面質量。
比如看直播時候,如果畫面波動比較大,碼流就會大起來,這個時候就能分析出來,P幀會變大,畫面幅度大,導致壓縮率變低。
如果這個時候強制限制碼流的話,畫面可能會失真,可能出現馬賽克現象。(AR:所以避免馬賽克的話就是不能限制碼流?)
如果畫面靜止不動,那么P幀會很小,壓縮率很高,碼流也就是GOP大小自然會變小。(AR:GOP大小∝碼率?(正比于))
GOP拉大,碼率不變,幀率不變,那就是每個幀的數據量變大,壓縮率變低,畫面還原度變高
0928更新GOP拉大和GOP拉長的問題(實際情況需要自己判斷)
拉長是指本來1s產生一個GOP,也就是一秒一個IDR幀,但是改成2s一個GOP,幀率不變。
拉大是指GOP容量變大,本來1sGOP大小100KB,變成120KB,幀數不變。
如果GOP中幀數增加,在壓縮率穩定的情況下(正常情況下壓縮率會變化,看圖像變化比例)必然會造成GOP變大,如果GOP大小保證不變,可以采取減少I幀(注意不是IDR幀)來換取更多的P和B幀。
(AR:我們的場景是圖像中小范圍波動,我們要保證這個小范圍的清晰度,需要增加更多的P幀?)
看到的許多文獻中,關于GOP拉大還是拉長都沒有說明,在計算碼流變化之中,需要明確GOP是怎么變化的。
根據我在直播攝像頭的觀察,在幀率固定的前提下,比如說2s一個I幀(上面說了直播一般I幀和IDR幀等同,沒有B幀),影響碼流大小的是畫面變化幅度,如果畫面靜止不動的話,碼流保持在很穩定的狀態;如果畫面變化幅度比較大,那碼流就會變大。
參考文章:關于GOP和幀率、碼率的關系
總結
以上是生活随笔為你收集整理的视频压缩编码 gop(Group of Pictures)(I帧间隔)的概念、IDR、I帧(关键帧,intra picture)、P帧、B帧、帧内压缩、帧间压缩、pts(显示时间)、dts(解码时间)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VLC播放器如何录制rtsp流生成视频文
- 下一篇: 编译器编译报错时aka是什么意思?(al