H.264中IDR帧和I帧区别
生活随笔
收集整理的這篇文章主要介紹了
H.264中IDR帧和I帧区别
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
IDR(Instantaneous Decoding Refresh)--即時(shí)解碼刷新。
? ? ? I和IDR幀都是使用幀內(nèi)預(yù)測的。它們都是同一個(gè)東西而已,在編碼和解碼中為了方便,要首個(gè)I幀和其他I幀區(qū)別開,所以才把第一個(gè)首個(gè)I幀叫IDR,這樣就方便控制編碼和解碼流程。IDR幀的作用是立刻刷新,使錯(cuò)誤不致傳播,從IDR幀開始,重新算一個(gè)新的序列開始編碼。而I幀不具有隨機(jī)訪問的能力,這個(gè)功能是由IDR承擔(dān)。IDR會導(dǎo)致DPB(DecodedPictureBuffer參考幀列表——這是關(guān)鍵所在)清空,而I不會。IDR圖像一定是I圖像,但I(xiàn)圖像不一定是IDR圖像。一個(gè)序列中可以有很多的I圖像,I圖像之后的圖像可以引用I圖像之前的圖像做運(yùn)動(dòng)參考。 ?? ? ? ?對于IDR幀來說,在IDR幀之后的所有幀都不能引用任何IDR幀之前的幀的內(nèi)容,與此相反,對于普通的I-幀來說,位于其之后的B-和P-幀可以引用位于普通I-幀之前的I-幀。從隨機(jī)存取的視頻流中,播放器永遠(yuǎn)可以從一個(gè)IDR幀播放,因?yàn)樵谒鬀]有任何幀引用之前的幀。但是,不能在一個(gè)沒有IDR幀的視頻中從任意點(diǎn)開始播放,因?yàn)楹竺娴膸偸菚们懊娴膸?
?
普通I幀與IDR(Instantaneous Decoding Refresh,瞬時(shí)解碼刷新)幀為均采用幀內(nèi)預(yù)測技術(shù)的視頻幀,同屬于I幀。
?
區(qū)別是:采用IDR幀編碼,會導(dǎo)致DPB(Decoded Picture Buffer,直譯為解碼圖像緩沖區(qū),即指參考幀列表)完成一次清空處理,而普通I幀不會。
?
那么,這樣帶來的直接結(jié)果是怎樣的呢?
即,當(dāng)前IDR幀后面的幀不會將當(dāng)前IDR幀之前已經(jīng)編碼的幀作為參考幀;而當(dāng)前普通I幀之后的幀有可能將當(dāng)前I幀之前的幀作為參考幀。
?
那么,這樣帶來的直接效果是怎樣的呢?
即,播放視頻的時(shí)候,可以直接從IDR幀開始播放,因?yàn)镮DR幀之前的幀與當(dāng)前IDR幀和之后的幀再也沒有直接地關(guān)聯(lián);而普通I幀則不行。
?
可以看到,一般來講,一段視頻的第0幀(也即首幀)是I幀,那么它算不算是IDR幀呢?答:算。
?
所以,IDR幀一定是I幀,反之不成立。
在H.264標(biāo)準(zhǔn)參考軟件(JM)下,通過IDRIntraEnable來設(shè)置是否支持IDR幀。
?
在H.264編碼中為了提高編碼效率,采用了與傳統(tǒng)MPEG-2編碼不同的幀預(yù)測方式,在H.264編碼中的B、P幀與MPEG-2中的B、P幀具有不同的幀間預(yù)測特性,H.264中的B、P幀能以多個(gè)視頻幀做為參考幀,以獲取更高的壓縮比,正是這些新的特性進(jìn)一步提高了H.264編碼的壓縮效率。為此,也在H.264編碼中引入了一個(gè)關(guān)鍵幀的概念即IDR幀。
IDR幀是一個(gè)GOP(Group of Pictures)中的首個(gè)I幀,即從IDR幀開始,重新開始一個(gè)新的序列編碼,它的作用是使解碼器立即刷新,從而使預(yù)測錯(cuò)誤不致傳播,并提供隨機(jī)訪問的能力。一個(gè)GOP中可以有很多的I幀,但只能有一個(gè)IDR幀。IDR幀一定是I幀,但I(xiàn)幀不一定是IDR幀。對IDR幀的編碼處理與I幀的處理相同:(1)進(jìn)行幀內(nèi)預(yù)測,決定所采用的幀內(nèi)預(yù)測模式。(2)像素值減去預(yù)測值,得到殘差。(3)對殘差進(jìn)行變換和量化。(4)變長編碼和算術(shù)編碼。(5)重構(gòu)圖像并濾波,得到的圖像作為其它幀的參考幀。
H.264與MPEG-2編碼的不同是,相對普通的I幀,位于其之后的B幀和P幀可以引用位于其之前的圖像幀最為參考,而對于IDR幀來說,在IDR幀之后的所有幀都不能引用其之前的幀的內(nèi)容。由此可以看出,從隨機(jī)存取的視頻流中,播放器永遠(yuǎn)可以從一個(gè)IDR幀播放,因?yàn)樵谒鬀]有任何幀引用之前的幀。但是,不能在一個(gè)沒有IDR幀的視頻中從任意點(diǎn)開始播放,因?yàn)楹竺娴膸偸菚们懊娴膸M(jìn)行幀間預(yù)測。
IDR就是這樣一種特殊的I幀,它確保后面的任何幀一定不參考其前面的幀,可以放心地作為關(guān)鍵幀,而將快編后的重新編碼計(jì)算量限定在編輯點(diǎn)前后2個(gè)GOP之內(nèi)。
通過IDR幀的原理,我們可以看出,如果一個(gè)視頻流的GOP的第一幀不是IDR幀而是普通I幀,會因?yàn)镠.264采用了多幀預(yù)測,有可能I幀后的P、B會參考I幀前的幀,這樣在編輯時(shí)如果以任意幀為編輯點(diǎn),則隨后的幀都應(yīng)重新進(jìn)行預(yù)測編碼,這無疑會增加設(shè)備的運(yùn)算量,降低編輯效率。
一幅圖像根據(jù)概念來分可以分為兩種:IDR圖像和非IDR圖像。一幅圖像是否是IDR圖像是由組成該圖像的NALU值決定的,如果組成該圖像的NALU如“圖1”語法結(jié)構(gòu)中nal_unit_type值為5,則該圖像為IDR幀,否則為非IDR幀。由此我們可以得出這樣的結(jié)論:
(1)nal_unit_type值為5的NALU只會出現(xiàn)在IDR幀中,而IDR幀中的所有NALU都是nal_unit_type 值為5的NALU;
(2)我們以組成一幅圖像的幀的類型來區(qū)分該圖像是否是IDR圖像是不對的。一個(gè)圖像序列中的所有幀都是I幀并不代表這個(gè)圖像就是IDR圖像。因?yàn)镮幀也可以從屬于nal_unit_type值為1的NALU。
可見,在編碼器設(shè)置中進(jìn)行參數(shù)設(shè)定,適時(shí)指定IDR幀十分重要。
?
?
?H.264中普通I幀和IDR幀究竟有什么區(qū)別?(不要與MPEG2中的I幀搞混淆了)?
分類: 視頻相關(guān)研究
2012-11-16 16:12 1780人閱讀 評論(0) 收藏 舉報(bào)
? ? ? ?糾結(jié)概念的人不少,這是個(gè)好事,但有時(shí)用實(shí)驗(yàn)的方法自己親自分析一下會更好. 一次刻骨銘心的體驗(yàn)勝過千百次的說教, 閑話少扯,進(jìn)入正題.
? ? ? ?在MPEG2中,有個(gè)重要的概念叫GOP(group of pictures),假設(shè)編碼的幀類型為:IBBPBBPBBPBBIBBPBBPBBPBBI..., 那么這個(gè)IBBPBBPBBPBB就叫一個(gè)GOP. 由于誤差會積累,但MPEG2中的I幀可以阻斷誤差的積累,也就是說,在MPEG中I幀后面的幀永遠(yuǎn)不會參考I幀前面的幀,也就是說,一個(gè)GOP中的幀永遠(yuǎn)不會參考前一個(gè)GOP中的幀.(另外說句題外話:B幀可以參考下一個(gè)GOP的I幀,但在MPEG2中,B幀不會作為參考幀,所以B幀不會導(dǎo)致誤差積累)
?
? ? ? ?在H.264中就不同了.很多人說,在H.264中沒有I幀這個(gè)概念了,當(dāng)然這也是有道理的,標(biāo)準(zhǔn)中的確沒有這么叫,但是,為了方便,也可以延續(xù)I幀這個(gè)概念,那么H.264中什么叫I幀呢?
? ? ? ?定義:H.264中的I幀是指幀中的宏塊都是采用幀內(nèi)預(yù)測方式,在H.264中有兩種I幀: 普通I幀和IDR幀(特殊I幀).
? ? ? ?在H.264中,是IDR幀阻斷了誤差的積累, IDR幀后面的幀都不能參考該IDR幀前面的幀. 在H.264中,普通的I幀并沒有阻斷誤差的積累,那就是說普通I幀后面的幀就可以參考該I幀之前的幀么?事實(shí)正是如此. 下面用H.264visa加以分析驗(yàn)證.
再次總結(jié):在H.264中,I幀分為普通I幀和IDR幀(特殊I幀); 在H.264中,是IDR幀阻斷了誤差的積累, IDR幀后面的幀都不能參考該IDR幀前面的幀, 普通的I幀并沒有阻斷誤差的積累,普通I幀后面的幀可以參考該I幀之前的幀. 在MPEG2中,I幀阻斷了誤差的積累,I幀后面的幀不可以參考該I幀之前的幀. 從這個(gè)意義上說,H.264中的IDR幀頗有MPEG2中I幀的味道.
?
?
I幀和IDR幀的區(qū)別
分類:H.264
2006-08-15 14:34
閱讀(761)評論(0)
? ? 看代碼看得頭昏腦脹,有時(shí)會上網(wǎng)搜索一些自己比較困擾的問題,覺得大家好強(qiáng)啊。其實(shí),任何成功的人都是一步步走到今天的,小貝也是每日苦練才踢出著名香蕉球的啊??墒?#xff0c;我常想我會有這樣的一天嗎?……好奇妙的感覺,懷著80%的擔(dān)心和20%的欣喜。算了,不要胡思亂想了。
? ? 看一個(gè)問題:
I幀和IDR幀的區(qū)別:
? ? IDR幀屬于I幀。解碼器收到IDR frame 時(shí),將所有的參考幀隊(duì)列丟棄(用x264_reference_reset函數(shù)實(shí)現(xiàn)——在encoder.c文件中)。這點(diǎn)是所有I幀共有的特性,但是收到IDR幀時(shí),解碼器另外需要做的工作就是:把所有的PPS和SPS參數(shù)進(jìn)行更新。由此可見,在編碼器端,每發(fā)一個(gè)IDR,就相應(yīng)地發(fā)一個(gè) PPS&SPS_nal_unit
? ? 這是網(wǎng)上搜索到的一個(gè)答案,有一定參考價(jià)值吧。
先說明:所有的IDR幀都是I幀,但是并不是所有I幀都是IDR幀。就是說,IDR幀是I幀的子集。(我們程序中設(shè)定的是每250幀出現(xiàn)一個(gè)IDR幀)
我們用的程序是這樣的:
? ? /* ------------------- Setup frame context ----------------------------- */
? ? /* 5: Init data dependant of frame type */
? ? if( h->fenc->i_type == X264_TYPE_IDR )
? ? {
? ? ? ? /* reset ref pictures */
? ? ? ? x264_reference_reset( h );
? ? ? ? i_nal_type ? ?= NAL_SLICE_IDR;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGHEST;
? ? ? ? i_slice_type = SLICE_TYPE_I;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_I )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* Not completely true but for now it is (as all I/P are kept as ref)*/
? ? ? ? i_slice_type = SLICE_TYPE_I;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_P )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* Not completely true but for now it is (as all I/P are kept as ref)*/
? ? ? ? i_slice_type = SLICE_TYPE_P;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_BREF )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* maybe add MMCO to forget it? -> low */
? ? ? ? i_slice_type = SLICE_TYPE_B;
? ? }
? ? else ? ?/* B frame */
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_DISPOSABLE;
? ? ? ? i_slice_type = SLICE_TYPE_B;
}
? ? x264_reference_reset函數(shù)的定義如下:(其實(shí),因?yàn)檫@個(gè)代碼是通用的,所以應(yīng)該是參考幀隊(duì)列。但是,我們只用一個(gè)參考幀,“隊(duì)列”并沒有意義。)
static inline void x264_reference_reset( x264_t *h )
{
? ? int i;
? ? /* reset ref pictures */
? ? for( i = 1; i < h->frames.i_max_dpb; i++ )
? ? {
? ? ? ? h->frames.reference[i]->i_poc = -1;
? ? }
? ? h->frames.reference[0]->i_poc = 0;
}
? ? 看來,好像是遇到IDR幀時(shí)才會將所有的參考幀隊(duì)列丟棄(x264_reference_reset( h );)。其實(shí),我們的程序默認(rèn)只用一個(gè)參考幀,這個(gè)問題就不是十分有意義了。
? ? 多參考幀情況下。
? ? 舉個(gè)例子:有如下幀序列:IPPPPIPPPP……(我們程序沒有B幀,所以幀序列簡單些,但道理是一樣的)。按照3個(gè)參考幀編碼。
? ? 因?yàn)椤鞍凑?個(gè)參考幀編碼”,所以參考幀隊(duì)列長度為3。
? ? 遇到綠色的I時(shí),并不清空參考幀隊(duì)列,把這個(gè)I幀加入?yún)⒖紟?duì)列(當(dāng)然I編碼時(shí)不用參考幀。)。再檢測到紅色的P幀時(shí),用到的就是PPI三幀做參考了。
? ? 不怕自己羅嗦(好記性不如爛筆頭),再強(qiáng)調(diào)一個(gè):一個(gè)參考幀,就是參考當(dāng)前幀的前面的那幀(因?yàn)闆]涉及到B幀,所以“前面的那幀”既是播放順序的,也是編碼順序的)。多個(gè)參考幀是一個(gè)道理。(我以前一直誤解為從前面的幾幀中找到最合適的一個(gè)參考幀)
? ? 最后,“但是收到IDR幀時(shí),解碼器另外需要做的工作就是:把所有的PPS和SPS參數(shù)進(jìn)行更新。由此可見,在編碼器端,每發(fā)一個(gè)IDR,就相應(yīng)地發(fā)一個(gè) PPS&SPS_nal_unit”應(yīng)該是對的吧。先這樣認(rèn)為:)
偶然機(jī)會,查到:IDR-instantaneous decoding refresh (IDR)picture; ? ? ? ?A coded picture in which all slices are I or SI slices that causes the decoding process to mark all reference pictures as "unused for reference" immediately after decoding the IDR picture. After the decoding of an IDR picture all following coded pictures in decoding order can be decoded without inter prediction from any picture decoded prior to the IDR picture. The first picture of each coded video sequence is an IDR picture. ? ? ?“也就是說,IDR的出現(xiàn)其實(shí)是相當(dāng)于向解碼器發(fā)出了一個(gè)清理reference buffer的信號吧,上面說前于這一幀的所有已編碼幀不能為inter做參考幀了。” ?
還有:“因?yàn)?64采用了多幀預(yù)測,就有可能在display order下I幀后的P會參考I幀前的幀,這樣在random access時(shí)如果只找I幀,隨后的幀的參考幀可能unavailable,IDR就是這樣一種特殊的I幀,把它定義為確保后面的P一定不參考其前面的幀,可以放心地random access。 ”
? ? ? I和IDR幀都是使用幀內(nèi)預(yù)測的。它們都是同一個(gè)東西而已,在編碼和解碼中為了方便,要首個(gè)I幀和其他I幀區(qū)別開,所以才把第一個(gè)首個(gè)I幀叫IDR,這樣就方便控制編碼和解碼流程。IDR幀的作用是立刻刷新,使錯(cuò)誤不致傳播,從IDR幀開始,重新算一個(gè)新的序列開始編碼。而I幀不具有隨機(jī)訪問的能力,這個(gè)功能是由IDR承擔(dān)。IDR會導(dǎo)致DPB(DecodedPictureBuffer參考幀列表——這是關(guān)鍵所在)清空,而I不會。IDR圖像一定是I圖像,但I(xiàn)圖像不一定是IDR圖像。一個(gè)序列中可以有很多的I圖像,I圖像之后的圖像可以引用I圖像之前的圖像做運(yùn)動(dòng)參考。 ?? ? ? ?對于IDR幀來說,在IDR幀之后的所有幀都不能引用任何IDR幀之前的幀的內(nèi)容,與此相反,對于普通的I-幀來說,位于其之后的B-和P-幀可以引用位于普通I-幀之前的I-幀。從隨機(jī)存取的視頻流中,播放器永遠(yuǎn)可以從一個(gè)IDR幀播放,因?yàn)樵谒鬀]有任何幀引用之前的幀。但是,不能在一個(gè)沒有IDR幀的視頻中從任意點(diǎn)開始播放,因?yàn)楹竺娴膸偸菚们懊娴膸?
?
普通I幀與IDR(Instantaneous Decoding Refresh,瞬時(shí)解碼刷新)幀為均采用幀內(nèi)預(yù)測技術(shù)的視頻幀,同屬于I幀。
?
區(qū)別是:采用IDR幀編碼,會導(dǎo)致DPB(Decoded Picture Buffer,直譯為解碼圖像緩沖區(qū),即指參考幀列表)完成一次清空處理,而普通I幀不會。
?
那么,這樣帶來的直接結(jié)果是怎樣的呢?
即,當(dāng)前IDR幀后面的幀不會將當(dāng)前IDR幀之前已經(jīng)編碼的幀作為參考幀;而當(dāng)前普通I幀之后的幀有可能將當(dāng)前I幀之前的幀作為參考幀。
?
那么,這樣帶來的直接效果是怎樣的呢?
即,播放視頻的時(shí)候,可以直接從IDR幀開始播放,因?yàn)镮DR幀之前的幀與當(dāng)前IDR幀和之后的幀再也沒有直接地關(guān)聯(lián);而普通I幀則不行。
?
可以看到,一般來講,一段視頻的第0幀(也即首幀)是I幀,那么它算不算是IDR幀呢?答:算。
?
所以,IDR幀一定是I幀,反之不成立。
在H.264標(biāo)準(zhǔn)參考軟件(JM)下,通過IDRIntraEnable來設(shè)置是否支持IDR幀。
?
在H.264編碼中為了提高編碼效率,采用了與傳統(tǒng)MPEG-2編碼不同的幀預(yù)測方式,在H.264編碼中的B、P幀與MPEG-2中的B、P幀具有不同的幀間預(yù)測特性,H.264中的B、P幀能以多個(gè)視頻幀做為參考幀,以獲取更高的壓縮比,正是這些新的特性進(jìn)一步提高了H.264編碼的壓縮效率。為此,也在H.264編碼中引入了一個(gè)關(guān)鍵幀的概念即IDR幀。
IDR幀是一個(gè)GOP(Group of Pictures)中的首個(gè)I幀,即從IDR幀開始,重新開始一個(gè)新的序列編碼,它的作用是使解碼器立即刷新,從而使預(yù)測錯(cuò)誤不致傳播,并提供隨機(jī)訪問的能力。一個(gè)GOP中可以有很多的I幀,但只能有一個(gè)IDR幀。IDR幀一定是I幀,但I(xiàn)幀不一定是IDR幀。對IDR幀的編碼處理與I幀的處理相同:(1)進(jìn)行幀內(nèi)預(yù)測,決定所采用的幀內(nèi)預(yù)測模式。(2)像素值減去預(yù)測值,得到殘差。(3)對殘差進(jìn)行變換和量化。(4)變長編碼和算術(shù)編碼。(5)重構(gòu)圖像并濾波,得到的圖像作為其它幀的參考幀。
H.264與MPEG-2編碼的不同是,相對普通的I幀,位于其之后的B幀和P幀可以引用位于其之前的圖像幀最為參考,而對于IDR幀來說,在IDR幀之后的所有幀都不能引用其之前的幀的內(nèi)容。由此可以看出,從隨機(jī)存取的視頻流中,播放器永遠(yuǎn)可以從一個(gè)IDR幀播放,因?yàn)樵谒鬀]有任何幀引用之前的幀。但是,不能在一個(gè)沒有IDR幀的視頻中從任意點(diǎn)開始播放,因?yàn)楹竺娴膸偸菚们懊娴膸M(jìn)行幀間預(yù)測。
IDR就是這樣一種特殊的I幀,它確保后面的任何幀一定不參考其前面的幀,可以放心地作為關(guān)鍵幀,而將快編后的重新編碼計(jì)算量限定在編輯點(diǎn)前后2個(gè)GOP之內(nèi)。
通過IDR幀的原理,我們可以看出,如果一個(gè)視頻流的GOP的第一幀不是IDR幀而是普通I幀,會因?yàn)镠.264采用了多幀預(yù)測,有可能I幀后的P、B會參考I幀前的幀,這樣在編輯時(shí)如果以任意幀為編輯點(diǎn),則隨后的幀都應(yīng)重新進(jìn)行預(yù)測編碼,這無疑會增加設(shè)備的運(yùn)算量,降低編輯效率。
一幅圖像根據(jù)概念來分可以分為兩種:IDR圖像和非IDR圖像。一幅圖像是否是IDR圖像是由組成該圖像的NALU值決定的,如果組成該圖像的NALU如“圖1”語法結(jié)構(gòu)中nal_unit_type值為5,則該圖像為IDR幀,否則為非IDR幀。由此我們可以得出這樣的結(jié)論:
(1)nal_unit_type值為5的NALU只會出現(xiàn)在IDR幀中,而IDR幀中的所有NALU都是nal_unit_type 值為5的NALU;
(2)我們以組成一幅圖像的幀的類型來區(qū)分該圖像是否是IDR圖像是不對的。一個(gè)圖像序列中的所有幀都是I幀并不代表這個(gè)圖像就是IDR圖像。因?yàn)镮幀也可以從屬于nal_unit_type值為1的NALU。
可見,在編碼器設(shè)置中進(jìn)行參數(shù)設(shè)定,適時(shí)指定IDR幀十分重要。
?
?
?H.264中普通I幀和IDR幀究竟有什么區(qū)別?(不要與MPEG2中的I幀搞混淆了)?
分類: 視頻相關(guān)研究
2012-11-16 16:12 1780人閱讀 評論(0) 收藏 舉報(bào)
? ? ? ?糾結(jié)概念的人不少,這是個(gè)好事,但有時(shí)用實(shí)驗(yàn)的方法自己親自分析一下會更好. 一次刻骨銘心的體驗(yàn)勝過千百次的說教, 閑話少扯,進(jìn)入正題.
? ? ? ?在MPEG2中,有個(gè)重要的概念叫GOP(group of pictures),假設(shè)編碼的幀類型為:IBBPBBPBBPBBIBBPBBPBBPBBI..., 那么這個(gè)IBBPBBPBBPBB就叫一個(gè)GOP. 由于誤差會積累,但MPEG2中的I幀可以阻斷誤差的積累,也就是說,在MPEG中I幀后面的幀永遠(yuǎn)不會參考I幀前面的幀,也就是說,一個(gè)GOP中的幀永遠(yuǎn)不會參考前一個(gè)GOP中的幀.(另外說句題外話:B幀可以參考下一個(gè)GOP的I幀,但在MPEG2中,B幀不會作為參考幀,所以B幀不會導(dǎo)致誤差積累)
?
? ? ? ?在H.264中就不同了.很多人說,在H.264中沒有I幀這個(gè)概念了,當(dāng)然這也是有道理的,標(biāo)準(zhǔn)中的確沒有這么叫,但是,為了方便,也可以延續(xù)I幀這個(gè)概念,那么H.264中什么叫I幀呢?
? ? ? ?定義:H.264中的I幀是指幀中的宏塊都是采用幀內(nèi)預(yù)測方式,在H.264中有兩種I幀: 普通I幀和IDR幀(特殊I幀).
? ? ? ?在H.264中,是IDR幀阻斷了誤差的積累, IDR幀后面的幀都不能參考該IDR幀前面的幀. 在H.264中,普通的I幀并沒有阻斷誤差的積累,那就是說普通I幀后面的幀就可以參考該I幀之前的幀么?事實(shí)正是如此. 下面用H.264visa加以分析驗(yàn)證.
再次總結(jié):在H.264中,I幀分為普通I幀和IDR幀(特殊I幀); 在H.264中,是IDR幀阻斷了誤差的積累, IDR幀后面的幀都不能參考該IDR幀前面的幀, 普通的I幀并沒有阻斷誤差的積累,普通I幀后面的幀可以參考該I幀之前的幀. 在MPEG2中,I幀阻斷了誤差的積累,I幀后面的幀不可以參考該I幀之前的幀. 從這個(gè)意義上說,H.264中的IDR幀頗有MPEG2中I幀的味道.
?
?
I幀和IDR幀的區(qū)別
分類:H.264
2006-08-15 14:34
閱讀(761)評論(0)
? ? 看代碼看得頭昏腦脹,有時(shí)會上網(wǎng)搜索一些自己比較困擾的問題,覺得大家好強(qiáng)啊。其實(shí),任何成功的人都是一步步走到今天的,小貝也是每日苦練才踢出著名香蕉球的啊??墒?#xff0c;我常想我會有這樣的一天嗎?……好奇妙的感覺,懷著80%的擔(dān)心和20%的欣喜。算了,不要胡思亂想了。
? ? 看一個(gè)問題:
I幀和IDR幀的區(qū)別:
? ? IDR幀屬于I幀。解碼器收到IDR frame 時(shí),將所有的參考幀隊(duì)列丟棄(用x264_reference_reset函數(shù)實(shí)現(xiàn)——在encoder.c文件中)。這點(diǎn)是所有I幀共有的特性,但是收到IDR幀時(shí),解碼器另外需要做的工作就是:把所有的PPS和SPS參數(shù)進(jìn)行更新。由此可見,在編碼器端,每發(fā)一個(gè)IDR,就相應(yīng)地發(fā)一個(gè) PPS&SPS_nal_unit
? ? 這是網(wǎng)上搜索到的一個(gè)答案,有一定參考價(jià)值吧。
先說明:所有的IDR幀都是I幀,但是并不是所有I幀都是IDR幀。就是說,IDR幀是I幀的子集。(我們程序中設(shè)定的是每250幀出現(xiàn)一個(gè)IDR幀)
我們用的程序是這樣的:
? ? /* ------------------- Setup frame context ----------------------------- */
? ? /* 5: Init data dependant of frame type */
? ? if( h->fenc->i_type == X264_TYPE_IDR )
? ? {
? ? ? ? /* reset ref pictures */
? ? ? ? x264_reference_reset( h );
? ? ? ? i_nal_type ? ?= NAL_SLICE_IDR;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGHEST;
? ? ? ? i_slice_type = SLICE_TYPE_I;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_I )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* Not completely true but for now it is (as all I/P are kept as ref)*/
? ? ? ? i_slice_type = SLICE_TYPE_I;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_P )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* Not completely true but for now it is (as all I/P are kept as ref)*/
? ? ? ? i_slice_type = SLICE_TYPE_P;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_BREF )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* maybe add MMCO to forget it? -> low */
? ? ? ? i_slice_type = SLICE_TYPE_B;
? ? }
? ? else ? ?/* B frame */
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_DISPOSABLE;
? ? ? ? i_slice_type = SLICE_TYPE_B;
}
? ? x264_reference_reset函數(shù)的定義如下:(其實(shí),因?yàn)檫@個(gè)代碼是通用的,所以應(yīng)該是參考幀隊(duì)列。但是,我們只用一個(gè)參考幀,“隊(duì)列”并沒有意義。)
static inline void x264_reference_reset( x264_t *h )
{
? ? int i;
? ? /* reset ref pictures */
? ? for( i = 1; i < h->frames.i_max_dpb; i++ )
? ? {
? ? ? ? h->frames.reference[i]->i_poc = -1;
? ? }
? ? h->frames.reference[0]->i_poc = 0;
}
? ? 看來,好像是遇到IDR幀時(shí)才會將所有的參考幀隊(duì)列丟棄(x264_reference_reset( h );)。其實(shí),我們的程序默認(rèn)只用一個(gè)參考幀,這個(gè)問題就不是十分有意義了。
? ? 多參考幀情況下。
? ? 舉個(gè)例子:有如下幀序列:IPPPPIPPPP……(我們程序沒有B幀,所以幀序列簡單些,但道理是一樣的)。按照3個(gè)參考幀編碼。
? ? 因?yàn)椤鞍凑?個(gè)參考幀編碼”,所以參考幀隊(duì)列長度為3。
? ? 遇到綠色的I時(shí),并不清空參考幀隊(duì)列,把這個(gè)I幀加入?yún)⒖紟?duì)列(當(dāng)然I編碼時(shí)不用參考幀。)。再檢測到紅色的P幀時(shí),用到的就是PPI三幀做參考了。
? ? 不怕自己羅嗦(好記性不如爛筆頭),再強(qiáng)調(diào)一個(gè):一個(gè)參考幀,就是參考當(dāng)前幀的前面的那幀(因?yàn)闆]涉及到B幀,所以“前面的那幀”既是播放順序的,也是編碼順序的)。多個(gè)參考幀是一個(gè)道理。(我以前一直誤解為從前面的幾幀中找到最合適的一個(gè)參考幀)
? ? 最后,“但是收到IDR幀時(shí),解碼器另外需要做的工作就是:把所有的PPS和SPS參數(shù)進(jìn)行更新。由此可見,在編碼器端,每發(fā)一個(gè)IDR,就相應(yīng)地發(fā)一個(gè) PPS&SPS_nal_unit”應(yīng)該是對的吧。先這樣認(rèn)為:)
偶然機(jī)會,查到:IDR-instantaneous decoding refresh (IDR)picture; ? ? ? ?A coded picture in which all slices are I or SI slices that causes the decoding process to mark all reference pictures as "unused for reference" immediately after decoding the IDR picture. After the decoding of an IDR picture all following coded pictures in decoding order can be decoded without inter prediction from any picture decoded prior to the IDR picture. The first picture of each coded video sequence is an IDR picture. ? ? ?“也就是說,IDR的出現(xiàn)其實(shí)是相當(dāng)于向解碼器發(fā)出了一個(gè)清理reference buffer的信號吧,上面說前于這一幀的所有已編碼幀不能為inter做參考幀了。” ?
還有:“因?yàn)?64采用了多幀預(yù)測,就有可能在display order下I幀后的P會參考I幀前的幀,這樣在random access時(shí)如果只找I幀,隨后的幀的參考幀可能unavailable,IDR就是這樣一種特殊的I幀,把它定義為確保后面的P一定不參考其前面的幀,可以放心地random access。 ”
總結(jié)
以上是生活随笔為你收集整理的H.264中IDR帧和I帧区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫繁育基地观光车路线
- 下一篇: MTD应用学习札记