完成一個H.265/HEVC碼流分析工具

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

一、背景

按慣例,每年年中的時候,公司都要講新平臺預研,但不等預研結束,公司高層就開會舉手敲定一個新平臺,而使得“預研”結束。今年主題之一是上H.265。第一個H.265標準在2013年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頭有差異,故可以使用該種方法。

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

3、鼠標雙擊某一個NAL時,根據前面得到NAL索引、偏移,讀取文件并解析,從而得到該NAL詳細信息,這里使用的方法,就是根據手冊,逐一讀取碼流。

三、實現

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

未動手寫代碼時,去下載商業工具玩玩,但只有幾天的試用期,就把幾個關鍵的NAL截圖保存起來,方便日后對比。后面過期了,就拿HM的工程做對比,該工程打開幾個宏就可以把運行過程的信息打印出來,包括解析碼流的各個字段。

然后按手冊的語法,參考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修正及完善》里寫了,這里不再寫出了。

四、界面

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

李遲作品 必屬精品

源代碼倉庫地址為:https://github.com/latelee/H264BSAnalyzer。后續不確定是否要繼續維護、更新,以倉庫代碼為準。

后記:調休期間,有傳言說大大boss拍板停止調研某國產的支持H.265的芯片平臺,但我沒有在正式場合得到信息,不懂是否真實。在不確定是否上H.265時,我決定搞這個工具,在不確定是否停止H.265時,完成這個工具。有始有終。

2015.11.21的更新:

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

H265碼流分析工具v2.1版本--latelee.org

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447176.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux中創建用戶并且配置sudo權限,百分百簡單有效

配置步驟如下: 登陸或切換到root用戶下;因為只有root用戶才具有權限進行用戶的添加,使用命令sudo su,切換為管理員用戶添加用戶 adduser -m youuser,并且在home路徑下創建同名的用戶文件夾passwd youuser,…

Java 計算兩個日期之間的相差天數

代碼如下 package com.data.dp;import org.apache.commons.lang3.StringUtils;import java.text.ParseException; import java.text.SimpleDateFormat;public class testDate {public static void main(String[] args) throws ParseException {SimpleDateFormat df new Simpl…

【HEVC】目前H265分析軟件推薦

2014-11-14liuwri本帖最后由 zxdaemon 于 2012-12-25 04:06 PM 編輯 1,Codecvisa: http://codecian.com/國產軟件,從最早的H264visa發展至今,感覺從剛開始的玩票,發展到今天專業級別的商業軟件,值得支持。軟…

將IPFS 配置服務器,電腦連接遠程服務器,環境配置

先前安裝配置的步驟省略,僅僅涉及后期的環境修改步驟 1,找到配置文件config,現需要使用命令ipfs init,從而生成.ipfs文件 ipfs init cd ~/.ipfs2,使用命令ls查看當前文件夾下面所包含的文件,正常情況小會…

Golomb及指數哥倫布編碼原理介紹及實現

文章來源: https://www.cnblogs.com/wangguchangqing/p/6297792.html , 寫的不錯,轉發出來。 2017年的第一篇博文。 本文主要有以下三部分內容: 介紹了Golomb編碼,及其兩個變種:Golomb-Rice和Exp-Golo…

解決ipfs 出現Error: can‘t publish while offline: pass `--allow-offline` to override的問題

原因 出現這個問題的原因是因為,ipfs未與公網上的節點相互連接,因此此時處于離線狀態 使用場景 部署自己的博客,后期的改動,累計追加在同一個地址,這個地址是唯一的,也就是創建ipfs生成的ID號 步驟 1&…

HEVC 編解碼資源

資料 overview 等 csvt系列詳見HHI主頁,適合:入門 Encoder Description 適合入門 Recommendation H.265 pdf 2016-12-22 標準文檔,適合:提高;解碼 High Efficiency Video Coding (HEVC): Algorithms and Architectures…

安裝ipfs-http-client出現constants@0.1.2 install: node build.js > index.browser.js錯誤的解決辦法

錯誤截圖 原先的命令 npm install --save-dev ipfs-http-client 修改后的命令 npm install --save-dev ipfs-http-client --unsafe-permtrue --allow-root

安裝ipfs-api的命令變了,最新版的命令如下

原先使用的命令安裝ipfs-api npm install --save-dev ipfs-api 現在使用的命令安裝ipfs-api npm install --save-dev ipfs-http-client 官方文檔 參考教程 官方文檔

執行truffle unbox react報錯,出現Error: connect ECONNREFUSED 0.0.0.0:443問題的解決辦法

前提:我是用的是MAC系統,不知道使用windows系統是否也可以 react-box 項目構建 localhost:ReactDapp liyuechun$ truffle unbox react-boxStarting unbox... ? Preparing to download box ? Downloading Unbox failed! RequestError: Error: connect…

區塊鏈相關問題 理解

本博客針對區塊鏈的部分問題進行詳解,希望幫助大家對于區塊鏈有一個更好的理解 1,如果散布虛假交易,怎么整?(誰欠我XXX比特幣) 1,可以發起虛假交易,但是很難被全網的節點接收并寫入…

區塊鏈的相關知識點

1,密碼學原理 密碼學原理 1,collision resistance 哈希函數 ,目前還是很安全的,沒有找到任何不同的內容其哈希是一致的情形。哈希碰撞(這個在數學上面是沒法證明的,都是日常的實踐表明,無法找…

使用MAC 編譯合約的時候報錯:

編譯報錯的顯示內容如下: Error: EACCES: permission denied, mkdir /Users/chy/Documents/ipfslearn/ipfs_eth_img/client/src/contracts 最簡單的解決方法 原因分析:執行的權限不夠 解決辦法:升級權限 使用命令 chmod 777 項目的文件夾使…

最新,使用truffle框架之后,安裝ipfs的api包文件的命令變化

原因 項目文件路徑變化了,不是先前直接在項目文件夾里面直接執行安裝ipfs的命令了,需要切換到client文件夾下面執行 路徑不對,會出現錯誤,錯誤提示如下 切換到正確的路徑之后,使用命令 npm install --save ipfs-http-…

通過node 完成簡單的web3 API調用測試

使用命令查看當前web3的版本 npm list web3輸入命令 node,進入終端 引入web3,使用命令 var web3 require(web3) 查看引入web3的版本 web3.version

LInux學習筆記(四)-----實操排雷

參考書籍:linux就該這么學 4 Vim 編輯器與 Shell 命令腳本 4.1 Vim 文本編輯器(在 Vim 中,無法直接從輸入模式切換到末行模式) 4.1.1 配置 Yum 軟件倉庫 注:書中好像有點問題,第一個 . 改成 /(我是Ubuntu發現原來不能用…

Web3.js 學習

web3.js Web3 JavaScript app APIweb3.js是一個JavaScript API庫,一般使得DApp在以太坊上運行web3.js通過RPC調用與本節點通信,用于任何暴露了RPC層的以太坊節點之間通信web3包含了eth對象,即web3.eth(專門和以太坊區塊鏈交互&am…

c語言指針入門

指針的用途非常廣泛,比如如果你想通過函數改變一個變量的值,就得用指針而不能用值傳遞。還有在很多時候變量,特別是對象的數據量實在太大,程序員就會用指針來做形參,只需要傳遞一個地址就行,大大提高了效率…

搭建基于飛槳的OCR工具庫,總模型僅8.6M的超輕量級中文OCR,單模型支持中英文數字組合識別、豎排文本識別、長文本識別的PaddleOCR

介紹 基于飛槳的OCR工具庫,包含總模型僅8.6M的超輕量級中文OCR,單模型支持中英文數字組合識別、豎排文本識別、長文本識別。同時支持多種文本檢測、文本識別的訓練算法。 相關鏈接 PaddleOCR項目地址飛槳開源深度學習平臺效果展示頁面中文OCR在線體驗地…

macos 10.15 django2.2+apache2.4+ladon+wsgi寫webseverice接口

他的文檔不夠完善,使用起來可能有坑,因為不知道如何將ladondjangoapache綁定在一起使用,所以放棄了。 提醒:最好用個虛擬環境,防止庫沖突我使用的是anaconda 安裝apache macos本身自帶apache,其他平臺百度…