日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

完成一个H.265/HEVC码流分析工具

發(fā)布時(shí)間:2023/12/13 c/c++ 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 完成一个H.265/HEVC码流分析工具 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

經(jīng)過(guò)大約一個(gè)月左右的業(yè)余時(shí)間,終于初步完成一個(gè)H.265/HEVC碼流分析工具。時(shí)間包括平時(shí)的周末、晚上,以及調(diào)休的集中時(shí)間。當(dāng)然,中秋回家過(guò)節(jié)不寫(xiě)代碼。截至今天,經(jīng)過(guò)多種H.265序列測(cè)試,也有各種工具對(duì)比,基本上無(wú)大問(wèn)題,v2.0版本終于釋放出來(lái)。v1.x版本是去年年初做的,彈指間一年多的今天又繼續(xù)做。但后面也不知道有沒(méi)有時(shí)間和心情完善,隨緣吧。

一、背景

按慣例,每年年中的時(shí)候,公司都要講新平臺(tái)預(yù)研,但不等預(yù)研結(jié)束,公司高層就開(kāi)會(huì)舉手敲定一個(gè)新平臺(tái),而使得“預(yù)研”結(jié)束。今年主題之一是上H.265。第一個(gè)H.265標(biāo)準(zhǔn)在2013年1月出來(lái),至今不夠3年時(shí)間,有很多公司盯上了這領(lǐng)域,勢(shì)頭很好,但畢竟只是開(kāi)始的幾年,還是有待發(fā)展。

這種宣傳性的東西,估計(jì)產(chǎn)品經(jīng)理、行業(yè)總監(jiān)們要關(guān)注,咱們這些寫(xiě)代碼的其實(shí)不用關(guān)心太多。但對(duì)于技術(shù)的研究、探索,還是很有必要的。網(wǎng)上已經(jīng)有很多商用的工具開(kāi)發(fā)出來(lái)了,在文章《初識(shí)HEVC/H.265》中提到一些。鑒于以前也寫(xiě)了H264碼流分析工具,從這方面入手會(huì)好一些,一來(lái)練練手,保持代碼熟悉度,二來(lái)在寫(xiě)的過(guò)程對(duì)照標(biāo)準(zhǔn)手冊(cè)學(xué)習(xí),效果比單看手冊(cè)好很多。于是就在原來(lái)工具基礎(chǔ)上,繼續(xù)做H265的分析。

二、思路

在文章《完成一個(gè)分析H264碼流的工具》中大概寫(xiě)了一些思路,但不是很系統(tǒng)。這里再寫(xiě)一下。核心代碼為h264bitstream開(kāi)源庫(kù),它提供了一個(gè)很好的H.264碼流讀、寫(xiě)的方案,而且開(kāi)源。它提供了基本的讀寫(xiě)碼流的接口。比如查找NAL,指數(shù)哥倫布編碼等。因此,使用該開(kāi)源庫(kù),只需根據(jù)標(biāo)準(zhǔn)手冊(cè)里的語(yǔ)法規(guī)定去一一解析即可。關(guān)于這個(gè)庫(kù),不在此處詳細(xì)展開(kāi)描述。

0、根據(jù)標(biāo)準(zhǔn)手冊(cè)語(yǔ)法,建立全局結(jié)構(gòu)體,每個(gè)字段都單獨(dú)存儲(chǔ)。所有結(jié)構(gòu)體歸屬于h264_stream_t和h265_stream_t結(jié)構(gòu)體。對(duì)于數(shù)量不確定的字段,統(tǒng)一使用vector存儲(chǔ)。

1、用戶(hù)打開(kāi)文件時(shí),先判斷文件類(lèi)型,目前只支持H.264和H.265兩種格式,如有后綴名,優(yōu)先使用后綴名判定,否則讀取文件開(kāi)始處的NAL頭,查看手冊(cè),兩種碼流的NAL頭有差異,故可以使用該種方法。

2、按字節(jié)讀取文件,根據(jù)start code解析NAL,得到NAL偏移量、長(zhǎng)度、類(lèi)型(如果是slice,還會(huì)解析出slice的類(lèi)型,如I幀、P幀、B幀),存儲(chǔ)于vector中,同時(shí),為了得到如視頻分辨率,幀率、YUV空間等信息,在解析NAL時(shí),一并進(jìn)行。做這些工作,是為了在界面的列表中列出各個(gè)NAL信息以及視頻的概要信息。詳見(jiàn)下文的界面截圖。

3、鼠標(biāo)雙擊某一個(gè)NAL時(shí),根據(jù)前面得到NAL索引、偏移,讀取文件并解析,從而得到該NAL詳細(xì)信息,這里使用的方法,就是根據(jù)手冊(cè),逐一讀取碼流。

三、實(shí)現(xiàn)

此處講述一下在編碼、學(xué)習(xí)過(guò)程的經(jīng)驗(yàn)。

未動(dòng)手寫(xiě)代碼時(shí),去下載商業(yè)工具玩玩,但只有幾天的試用期,就把幾個(gè)關(guān)鍵的NAL截圖保存起來(lái),方便日后對(duì)比。后面過(guò)期了,就拿HM的工程做對(duì)比,該工程打開(kāi)幾個(gè)宏就可以把運(yùn)行過(guò)程的信息打印出來(lái),包括解析碼流的各個(gè)字段。

然后按手冊(cè)的語(yǔ)法,參考h264bitstream代碼,建立H.265的對(duì)應(yīng)結(jié)構(gòu)體,基本上語(yǔ)法大的方面保持一致,但H.265多了一個(gè)VPS結(jié)構(gòu)體,還有ptl(profile tier level)。添加這些語(yǔ)法,耗時(shí)很多,一來(lái)語(yǔ)法字段本來(lái)就多,二來(lái)要對(duì)著手冊(cè)看——即使這樣,后面還是發(fā)現(xiàn)有個(gè)別錯(cuò)誤、疏漏的。H.264/H.265有很多字段是屬于數(shù)組類(lèi)型,根據(jù)某一數(shù)值來(lái)確定范圍。起初參考h264bitstream,數(shù)組統(tǒng)一使用255,但后來(lái)想想還是用Vector好一些,就改了。

讀取碼流完成了,打印字段也完成了,再?gòu)暮暧^(guān)上看整個(gè)工程,發(fā)現(xiàn)寫(xiě)有亂。這次是在去年寫(xiě)的工具上進(jìn)行的,其實(shí)改善空間很大,只是自己懶,不去做。于是趁機(jī)會(huì)把代碼重構(gòu)了,重構(gòu)后條理性好了很多。

之后就進(jìn)行調(diào)試。在這個(gè)過(guò)程,還是有不少問(wèn)題。

有些是細(xì)節(jié)問(wèn)題,比如有個(gè)地方判斷B幀,結(jié)果把“==”寫(xiě)成“=”,查了半天才發(fā)現(xiàn)。還有一個(gè)地方是pred_weight_table的判斷,判斷P和B幀的條件不同,但代碼復(fù)制時(shí)不注意,沒(méi)搞對(duì),又花了很久排查。還有一個(gè)是讀取slice頭部的num_ref_idx_l1_active_minus1字段,同樣是代碼復(fù)制,沒(méi)有注意是ue(),在和HM代碼運(yùn)行結(jié)果對(duì)比時(shí),花了很多時(shí)間才確定問(wèn)題。

打印NAL字段函數(shù)里,有些不按語(yǔ)法上寫(xiě),導(dǎo)致個(gè)別字段和其它工具的不一致,于是又對(duì)著手冊(cè)改——開(kāi)始時(shí)就應(yīng)該如此,又是懶沒(méi)用心寫(xiě)。

下面說(shuō)說(shuō)其它的問(wèn)題。

解析NAL,是要將碼流轉(zhuǎn)換成RBSP,代碼工程統(tǒng)一使用h264bitstream提供的nal_to_rbsp函數(shù),但該函數(shù)只針對(duì)只有一個(gè)字節(jié)的H.264碼流的,而H.265的NAL頭有2個(gè)字節(jié)。在轉(zhuǎn)換時(shí)是不包括NAL頭的,于是就手動(dòng)修改該函數(shù)的參數(shù)。

關(guān)于SEI,h264bitstream庫(kù)并沒(méi)有做過(guò)多解析。或許是SEI信息重要程度不高吧。還有一個(gè)問(wèn)題。在PPS中,more_rbsp_data的判斷不正確。導(dǎo)致后面的字段不再解析。幾經(jīng)搜索,最終使用FFMPEG代碼的判斷方法,似乎是正常的了,就不再深究。

而至于其它的修改、完善,我在另一篇文章《關(guān)于h264bitstream的bug修正及完善》里寫(xiě)了,這里不再寫(xiě)出了。

四、界面

無(wú)論怎樣,還是完成了。此事務(wù)算告一段落。界面如下:

源代碼倉(cāng)庫(kù)地址為:https://github.com/latelee/H264BSAnalyzer。后續(xù)不確定是否要繼續(xù)維護(hù)、更新,以倉(cāng)庫(kù)代碼為準(zhǔn)。

后記:調(diào)休期間,有傳言說(shuō)大大boss拍板停止調(diào)研某國(guó)產(chǎn)的支持H.265的芯片平臺(tái),但我沒(méi)有在正式場(chǎng)合得到信息,不懂是否真實(shí)。在不確定是否上H.265時(shí),我決定搞這個(gè)工具,在不確定是否停止H.265時(shí),完成這個(gè)工具。有始有終。

2015.11.21的更新:

發(fā)布v2.1版本。使用樹(shù)形控件顯示碼流語(yǔ)法元素。增加界面的縮放功能。離上個(gè)版本有差不多2個(gè)月了,理論上搞這么個(gè)小功能不用花那么久的,主要還是因?yàn)樽约簯?#xff0c;一到周末就完全不想寫(xiě)代碼了。新版本界面如下(一眼看上去,頓時(shí)覺(jué)得高端好多):

總結(jié)

以上是生活随笔為你收集整理的完成一个H.265/HEVC码流分析工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。