一、問(wèn)題
當(dāng)h264流沒(méi)有b幀洽胶、幀參考關(guān)系如上圖所示時(shí),期望輸入1幀數(shù)據(jù)給解碼器后裆馒,解碼器能立即輸出解碼幀姊氓。但事實(shí)上intel解碼器會(huì)緩存若干幀后才輸出解碼幀,引起了延遲喷好。
二翔横、分析結(jié)果
由于解碼器解碼1幀后,不確定后續(xù)是否b幀梗搅、且p幀也可能亂序禾唁,因此默認(rèn)情況下intel解碼器會(huì)等到DPB(Decoded Picture Buffer)滿了才輸出解碼幀。為了降低緩存導(dǎo)致的延遲无切,需要改變編碼器參數(shù):
1荡短、將sps.pic_order_cnt_type設(shè)置為2(pic_order_cnt_type=2時(shí),顯示順序與解碼順序一致哆键,解碼器會(huì)立即輸出解碼幀)? or
2掘托、將MaxDpbSize設(shè)置為1,MaxDpbSize限制了DPB的大小
三洼哎、h264相關(guān)知識(shí)
1烫映、顯示順序與解碼順序
解碼順序由frame_num決定沼本,frame_num存在slice header中噩峦,默認(rèn)情況下frame_num=上一個(gè)參考幀的frame_num+1。
顯示順序由POC決定抽兆,有3種計(jì)算方式:
type 0识补,POC最低有效位記錄在slice header中,最靈活辫红,但是需要的數(shù)據(jù)量最大
type 1凭涂,在sps中指定參考幀與上一個(gè)參考幀的增量祝辣、非參考幀和上一個(gè)參考幀的增量,每個(gè)非參考幀可以指定Delta POC切油。POC offset(和上一個(gè)參考幀的POC的差值) = sps中指定的增量 + Delta POC蝙斜。
type 2澎胡,POC=frame_num孕荠,顯示順序和解碼順序一樣
2、如何計(jì)算MaxDpbSize
sps.vui_parameters.max_dec_frame_buffering在H.264 Annex E中定義攻谁,為可選參數(shù)稚伍。
如果max_dec_frame_buffering參數(shù)存在,那么MaxDpbSize=max_dec_frame_buffering戚宦。
如果max_dec_frame_buffering參數(shù)不存在个曙,MaxDpbSize可以通過(guò)level和畫(huà)面大小求出,下面例子展示計(jì)算過(guò)程受楼。
MaxDpbSize計(jì)算公式:
MaxDpbSize =?min(floor(MaxDpbMbs / (PicWidthInMbs * FrameHeightInMbs)), 16)?
該h264流的level=4.2垦搬,對(duì)應(yīng)的MaxDpbMbs=34816
PicWidthInMbs=(pic_width_in_mbs_minus1+1)= 120
由于frame_mbs_only_flag==1,因此FrameHeightInMbs=pic_height_in_mbs_minus1+1=68
MaxDpbSize =?min(floor(34816 / (120 * 68)), 16) = 4那槽,意味著intel解碼器會(huì)緩存4個(gè)解碼后的幀悼沿。