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