乙個H 265 HEVC碼流分析工具

2021-08-19 17:26:45 字數 2363 閱讀 7594

經過大約乙個月左右的業餘時間,終於初步完成乙個h.265/hevc碼流分析工具。時間包括平時的週末、晚上,以及調休的集中時間。當然,中秋回家過節不寫**。截至今天,經過多種h.265序列測試,也有各種工具對比,基本上無大問題,v2.0版本終於釋放出來。v1.x版本是去年年初做的,彈指間一年多的今天又繼續做。但後面也不知道有沒有時間和心情完善,隨緣吧。

按慣例,每年年中的時候,公司都要講新平台預研,但不等預研結束,公司高層就開會舉手敲定乙個新平台,而使得「預研」結束。今年主題之一是上h.265。第乙個h.265標準在2023年1月出來,至今不夠3年時間,有很多公司盯上了這領域,勢頭很好,但畢竟只是開始的幾年,還是有待發展。

這種宣傳性的東西,估計產品經理、行業總監們要關注,咱們這些寫**的其實不用關心太多。但對於技術的研究、探索,還是很有必要的。網上已經有很多商用的工具開發出來了,在文章《初識hevc/h.265》中提到一些。鑑於以前也寫了h264碼流分析工具,從這方面入手會好一些,一來練練手,保持**熟悉度,二來在寫的過程對照標準手冊學習,效果比單看手冊好很多。於是就在原來工具基礎上,繼續做h265的分析。

在文章《完成乙個分析h264碼流的工具》中大概寫了一些思路,但不是很系統。這裡再寫一下。核心**為h264bitstream開源庫,它提供了乙個很好的h.264碼流讀、寫的方案,而且開源。它提供了基本的讀寫碼流的介面。比如查詢nal,指數哥倫布編碼等。因此,使用該開源庫,只需根據標準手冊裡的語法規定去一一解析即可。關於這個庫,不在此處詳細展開描述。

0、根據標準手冊語法,建立全域性結構體,每個欄位都單獨儲存。所有結構體歸屬於h264_stream_t和h265_stream_t結構體。對於數量不確定的字段,統一使用vector儲存。

1、使用者開啟檔案時,先判斷檔案型別,目前只支援h.264和h.265兩種格式,如有字尾名,優先使用字尾名判定,否則讀取檔案開始處的nal頭,檢視手冊,兩種碼流的nal頭有差異,故可以使用該種方法。

3、滑鼠雙擊某乙個nal時,根據前面得到nal索引、偏移,讀取檔案並解析,從而得到該nal詳細資訊,這裡使用的方法,就是根據手冊,逐一讀取碼流。

此處講述一下在編碼、學習過程的經驗。

然後按手冊的語法,參考h264bitstream**,建立h.265的對應結構體,基本上語法大的方面保持一致,但h.265多了乙個vps結構體,還有ptl(profile tier level)。新增這些語法,耗時很多,一來語法字段本來就多,二來要對著手冊看——即使這樣,後面還是發現有個別錯誤、疏漏的。h.264/h.265有很多欄位是屬於陣列型別,根據某一數值來確定範圍。起初參考h264bitstream,陣列統一使用255,但後來想想還是用vector好一些,就改了。

讀取碼流完成了,列印欄位也完成了,再從巨集觀上看整個工程,發現寫有亂。這次是在去年寫的工具上進行的,其實改善空間很大,只是自己懶,不去做。於是趁機會把**重構了,重構後條理性好了很多。

之後就進行除錯。在這個過程,還是有不少問題。

有些是細節問題,比如有個地方判斷b幀,結果把「==」寫成「=」,查了半天才發現。還有乙個地方是pred_weight_table的判斷,判斷p和b幀的條件不同,但**複製時不注意,沒搞對,又花了很久排查。還有乙個是讀取slice頭部的num_ref_idx_l1_active_minus1欄位,同樣是**複製,沒有注意是ue(),在和hm**執行結果對比時,花了很多時間才確定問題。

列印nal欄位函式裡,有些不按語法上寫,導致個別欄位和其它工具的不一致,於是又對著手冊改——開始時就應該如此,又是懶沒用心寫。

下面說說其它的問題。

解析nal,是要將碼流轉換成rbsp,**工程統一使用h264bitstream提供的nal_to_rbsp函式,但該函式只針對只有乙個位元組的h.264碼流的,而h.265的nal頭有2個位元組。在轉換時是不包括nal頭的,於是就手動修改該函式的引數。

關於sei,h264bitstream庫並沒有做過多解析。或許是sei資訊重要程度不高吧。還有乙個問題。在pps中,more_rbsp_data的判斷不正確。導致後面的字段不再解析。幾經搜尋,最終使用ffmpeg**的判斷方法,似乎是正常的了,就不再深究。

而至於其它的修改、完善,我在另一篇文章《關於h264bitstream的bug修正及完善》裡寫了,這裡不再寫出了。

無論怎樣,還是完成了。此事務算告一段落。介面如下:

源**倉庫位址為:後續不確定是否要繼續維護、更新,以倉庫**為準。

後記:調休期間,有傳言說大大boss拍板停止調研某國產的支援h.265的晶元平台,但我沒有在正式場合得到資訊,不懂是否真實。在不確定是否上h.265時,我決定搞這個工具,在不確定是否停止h.265時,完成這個工具。有始有終。

2015.11.21的更新:

發布v2.1版本。使用樹形控制項顯示碼流語法元素。增加介面的縮放功能。離上個版本有差不多2個月了,理論上搞這麼個小功能不用花那麼久的,主要還是因為自己懶,一到週末就完全不想寫**了。新版本介面如下(一眼看上去,頓時覺得高階好多):

H265 HEVC 裸流資料解析

nalu type型別判斷方式 int type code 0x7e 1 型別判斷方式為 00 00 00 01 後的乙個位元組右移乙個位,下面是幾種主要型別 0x40 1 得到0x20,十進位制32,為nal vps 0x42 1 得到0x21,十進位制33,為nal sps 0x44 1 得到0...

讀H 265 HEVC編碼筆記(一)

nal 1分層結構 mtu maxiumum transmission unit 最大傳輸單元 2為啥要nal?3 網路分組與nalu的組合形式 4 影象型別 vclu vcl nalu vclu的頭資訊標識vclu載荷的內容特性,主要標識ss的重要性及與其他影象的依賴關係。non vclu 承載的...

H265碼流分析

h265相比較於h264,除了包含sps pps外,還多包含乙個vps 在nalu header上,h.264的nalu header是乙個位元組,而h.265則是兩個位元組。以0x4001為例,頭資訊可以被解析成4個部分,其中 對比h.264的頭資訊,h.265移除了nal ref idc,此資訊...