h264解碼之自定義資訊(SEI)

2021-10-09 03:14:02 字數 2557 閱讀 2855

針對h264的解析網上優秀得博文、帖子一抓一大把,我就不在這班門弄斧了,僅僅提取一些自己在用的過程中比較有用的資訊,對於sei自定義資訊字段,雖然網上資訊很多,但不容易精確搜到,就像我之前曾遇到一篇對我個人非常有用的文章,但後面一直找不到,現在再次看到,就把部分提取了出來,記錄下,方便自己後面再次用到方便,也看能不能幫助到部分碼友。

起始碼(暗紅底色)"0x00000001"分割出來的位元流即是nal unit,起始碼緊跟的第乙個位元組(墨綠底色)是nal header。上圖「nal header」一共出現了四個數值:

sei payload type

"0x06"後乙個位元組為「0x05」(淡黃底色)是sei payload type,即表徵sei payload分析遵循user_data_unregistered()語法。

在國標中。sei payload type為5,為自定義訊息:如圖    

「0x05」後乙個位元組為「0x2f」(淡藍底色)是sei payload size,此時整個payload是47個位元組。

sei payload uuid

"0x2f"隨後的16個位元組即為uuid,此時uuid為:

dc45e9bde6d948b7962cd820d923eeef
sei payload content

由於payload size是47個位元組,除去16位元組的uuid,剩下31個位元組的content。由於content是字串,所以有結束符"0x00",有效的30個字元內容是

zencoder video encoding system
47個payload位元組後的"0x80"(灰底色)即是rbsp trailing bits,在user_data_unregistered()裡面都是按位元組寫入的,所以此時的nal unit結尾寫入的位元組一定是0x80。

下面開始解析一段含sei資訊的h264資料,資料中包含,座標資訊,人員資訊,先把**貼出來,再一一說明**中的各個部分:

注:已經去除起始碼00 00 00 01了

可參考:

unsigned char* data_buf = null;

if ((data[0] & 0x1f) == 6)//判斷是否是sei

; int ntype = 0;

unsigned char * sei = (unsigned char *)(data + 1);

ncount = size;

//獲取sei資訊:payload size、payload type、uuid

int nsize = get_sei_buffer(sei, ((unsigned char*)data + size - sei), buf, &ncount, &ntype);

if (5 == ntype)//判斷為5,自定義訊息user_data_unregistered()

if (nsd_num > 0)

}} }

return;

}//獲取sei資訊:payload size、payload type、uuid

int nsize = get_sei_buffer(sei, ((unsigned char*)data + size - sei), buf, &ncount, &ntype);

if (5 == ntype)//判斷為5,自定義訊息user_data_unregistered()

if (nsd_num > 0)

}} }

return;

}

get_sei_buffer如下:

int get_sei_buffer(unsigned char * data, uint32_t size, unsigned char * buffer, int *count, int *ntype)

while (*sei++ == 255);

//資料長度

do while (*sei++ == 255);

//檢查uuid

static unsigned char uuid = ;

if (sei_size >= uuid_size && sei_size <= (data + size - sei) &&

sei_type == 5 /*&& memcmp(sei, uuid, uuid_size) == 0*/)

}*count = sei_size;

return sei_size;

} return -1;

}

H264解碼之PES流解析

可以看出 固定頭由3部分組成 下面依次介紹其每個欄位的含義 escr欄位 此欄位佔位48bit,由33bit的escr base欄位和9bit的escr extension欄位組成,escr flag 1時此字段存在 資料依次順序 es rate欄位 目標解碼器接收pes分組位元組速率,禁止為0,佔...

H264解碼之RTP流解析

rtp全名是real time transport protocol 實時傳輸協議 它是ietf提出的乙個標準,對應的rfc文件為rfc3550 rfc1889為其過期版本 rfc3550不僅定義了rtp,而且定義了配套的相關協議rtcp real time transport control pr...

Django 之自定義頭部資訊

當我們使用 django 來搭建一套網頁系統,有時候我們會需要在網頁裡加入一些資訊,比如宣示版權之類的資訊,而如果在每乙個需要渲染的頁面都加上這些資訊,會比較麻煩。而在 django 裡有乙個中介軟體 middleware 可以幫助我們實現這個功能而不需要在每乙個返回的 html 頁面都手動加上。使...