h264幀邊界識別

2021-07-05 20:49:35 字數 1457 閱讀 5033

幀邊界識別簡介

h.264 將構成一幀影象所有nalu 的集合稱為乙個au,幀邊界識別實際上就是識別au。因為h.264 取消幀級語法,所以無法簡單地從碼流中獲取au。解碼器只有在解碼的過

程中,通過某些語法元素的組合才能判斷一幀影象是否結束。一般來說,解碼器必須在完成一幀新影象的第乙個slice_header 語法解碼之後,才能知道前一幀影象已經結束。

因此,最嚴謹的au 識別步驟如下:

步驟 1 對碼流實施「去03 處理」。

步驟 2 解析nalu 語法。

步驟 3 解析slice_header 語法。

步驟 4 綜合判斷前後兩個nalu 以及對應的slice_header 中的若干個語法元素,看是否發生變化。

如果發生變化,則說明這兩個nalu 屬於不同的幀,否則說明這兩個nalu 屬於同一幀。

----結束

顯然,在解碼前完成上述的au 識別消耗許多cpu 資源,因此不推薦使用au 方式解碼

為了提供一種簡單的

au 識別方案,

h.264

規定一種型別為

09 的

nalu

,即編碼器在每次完成乙個

au 編碼後,在碼流中插入乙個型別為

09 的

nalu

,在這個前提下,解碼器只需要從碼流中搜尋型別為

09 的

nalu

即可獲得乙個au。

h.264

並不強制要求編碼器插入型別為

09 的

nalu

,因此並非所有的碼流都具備這種特徵。對於編碼器和解碼器協同工作的應用場景,建議讓編碼器插入型別為

09 的

nalu

,這樣可以降低解碼器識別

au 的代價。

為了降低解碼器在解碼前識別au 的代價,本文提出一種高效的au 識別方法,其主要思路是利用一幀影象的第乙個slice_header 中的語法元素first_mb_in_slice 一般等於0 這

個特徵(對於包含aso 或者fmo 特性的碼流,這個條件不一定成立)。

typedef struct parsecontext parsecontext;  

signed int  decloadau(unsigned char* pstream, unsigned int istreamlen, parsecontext *pc)  

for( i = 0; i < istreamlen; i++)  

if( pstream[i] & 0x80) /* 查詢first_mb_in_slice為0的slice頭確定一幅影象的開始 */  

else  

}  }  if (i < istreamlen)  

}  pc->framestartfound = 0;  

return -1; /* 沒有找到au邊界返回-1 */  

H264中NAL幀識別

假設一段h264的碼流為 00 00 00 0141 e6 60 其中的00 00 00 01為起始碼,而起始碼之後的下乙個位元組就可以檢測出這一幀的型別。在上面的碼流中起始碼之後的位元組位 0x41,換算成二進位制為 0100 0001。注 我解讀順序為從左往右算。對於0100 0001 1 第1...

H 264參考幀管理

引言 h 264相對於以前的標準,採用了多參考幀的技術,提高了編碼器的效能,但也增加了實現的複雜度,在理解上也加大了難度。下面是我近來參閱一些資料的總結 frame num 標誌片的解碼順序,當前影象是idr 立即重新整理影象 時,設定為0 相對於前面乙個參考幀 解碼順序 增加1 poctype0 ...

H 264多參考幀

h264中允許從多至15個幀裡面選擇1幀或者2幀出來作為參考進行 所以必須引入乙個列表來管理這些參考影象,對與p slice而言,對應 list0,對於 b slice 而言,還需要多乙個 list1,因為 b slice 是進行的兩次 乙個前向乙個後向 兩個前向 兩個後向 參考幀分為 long t...