HEVC代碼學習0:HM使用+碼流分析教程

第一次面對如此浩大的工程代碼,真的不知如何下手。拜讀HEVC_CJL大神的博客,受益匪淺。以下將記錄個人學習過程,有不對的地方請諒解指正,十分感謝。

 

更新

·2016.10.10:對HM使用方法進行了描述。

·2018.01.23:對原HM使用方法進行了較大更新,增加了HM下載和碼流分析部分。

·2018.03.05:增加HM常見問題及解決方法。

·2018.03.28:增加針對編碼速度慢問題補充說明。

·2018.04.14:增加編碼輸出信息介紹。

·2018.07.23:修改 2.2 配置cfg文件中的一處錯誤。

·2018.08.16:改正 2.5 編碼輸出信息中GOP和TId解釋錯誤,感謝博友qq_25276393指正。

 

一、HM使用教程

1.下載
HM爲HEVC的參考軟件,下載地址:https://hevc.hhi.fraunhofer.de/svn/svn_HEVCSoftware/

分成三個大類:
trunk:主幹程序,是最新的HM主線版本。
branches:分支程序,是擴展的HM版本。
tags:各個版本的HM版本。

這裏下載需要使用TortoiseSVN,網上可以直接下載,這是一個版本控制工具軟件,具體介紹見百度百科。安裝SVN後,在桌面右鍵可以看到多了一個SVN Checkout,點擊後會出現一個對話框。

找到要下載的HM版本,打開到如下界面,將地址複製到SVN文件下載地址對應的對話框處,點OK開始下載。

在保存地址可以找到下載的HM版本。


附加:

JEM下載地址:https://jvet.hhi.fraunhofer.de/svn/svn_HMJEMSoftware/

JEM使用方法見https://blog.csdn.net/lin453701006/article/details/79941425,與HM類似,使用中改動在於cfg。

HM/JEM+360Lib下載地址:https://jvet.hhi.fraunhofer.de/svn/svn_360Lib/

 

2.HM使用方法

2.1 HM工程

以HM16.6爲例,在HM-16.6目錄下打開build文件夾,用VS打開對應版本的sln,可以看到HM包含的工程。

早期的HM解決方案包含了7個工程:
(1) TAppCommon 編碼器和解碼器共用的應用函數
(2) TAppDecoder 解碼器的應用函數
(3) TAppEncoder 編碼器的應用函數
(4) TLibCommon 編碼器和解碼器共用的庫函數
(5) TLibDecoder 解碼器的庫函數
(6) TLibEncoder 編碼器的庫函數
(7) TLibVideoIO 視頻輸入、輸出庫函數
後來又增加了2個工程:TAppDecoderAnalyser和TLibDecoderAnalyser。

使用時首先右鍵TAppEncoder-設爲啓動項目,配置設爲debug x64,生產解決項目。


HEVC標準規定的是解碼端,編碼端可以隨意改動,因此一般的工作都是集中於編碼器方面。

 

 

 2.2 配置cfg文件

HM使用是需要配置參數的,參數包括cfg和輸入參數。HM目錄下cfg文件夾中存儲了公共測試的配置文件,分爲4種,下面就以encoder_randomaccess_main.cfg爲例,打開encoder_randomaccess_main.cfg。在cfg下的per-sequence文件夾中,還有公共測試序列的配置文件,任意打開一個將其複製到encoder_randomaccess_main.cfg中的#======== Profile ================前,添加到原始的#======== File I/O ===============部分BitstreamFile之前,如下圖。

 

這裏面通過英文可以瞭解參數對應內容,不做具體解釋了。一般需要修改的就是輸入文件、分辨率和編碼幀數,再就是QP。

 

2.3 改輸入參數

右擊TAppEncoder選擇屬性,打開調試,如圖更改以下內容

命令參數:-c cfg地址\xxx.cfg

-c是指定使用該配置文件的參數進行編碼。

 

2.4 運行

命令行顯示如下圖,需要耐心等待,生成編碼後的yuv和bin文件

 

編碼結束會在命令行下輸出編碼後的bit數、YUV、編碼時間等信息,爲記錄方便,在2.3輸入參數中增加>out.txt。編碼結束找到輸出文件打開可以看到相關信息,如下圖:

2.5 編碼輸出信息

上圖是HM輸出在命令行窗口的信息,很多新手都會想知道編碼質量在哪看,就在這裏,下面大概介紹下編碼輸出的信息。

編碼結束後輸出的信息中給出了編碼質量、時間,這也是就是爲什麼強調用>out.txt保存這些信息。

 

首先會輸出一些編碼的輸入參數:

然後就是在每編完一幀後,會輸出一個該幀的編碼信息,其中重要的是:POC(對應圖像時域播放順序的序號,這裏POC 0 就是時域播放第一幀)、TId(temporal id 時域層序號,一個幀只能參考時域層低於他的幀,不能參考更高層的幀),總比特數,YUV各自的PSNR值。

這裏再補充介紹下POC和TId,上圖是分層B幀結構。其中第x幀中的x,即爲當前幀的POC,即播放順序,注意和編碼順序區分,詳見分層B幀碼預測結構。右側的Temporal Level對應就是TId,比如第0幀和第8幀 TId爲0,第4幀 TId爲1,第4幀可以參考第0幀和第8幀,反之不可以。

最後就是在編完要求的幀數後輸出的總的編碼信息,包括全部幀的總bit數、YUV各自及總的PSNR值,以及I、P、B幀的幀數、bit數、YUV各自及總的PSNR值,還有編碼時間。I幀、P幀、B幀的概念這裏不再贅述。

論文中在說編碼性能時一般會提到BD-rate和編碼時間,時間就是這裏Total Time,而BD-rate是根據總的bitrate和YUV三通道的PSNR計算得到的,但一般要使用4個QP的測試結果來進行比較,如下圖。這裏就不再詳細介紹BD-rate的具體計算方法。

 

2.6 HM常見問題及解決方法

 

HM是個十分龐大的工程,因此出錯是十分常見的,尤其對於新手。下面列舉一下常見的問題及解決方法。

程序異常中斷是有提示信息的,但需要注意,如果直接使用VS進行調試,程序異常跳出會直接結束,很可能命令行窗口直接自動關閉了,無法查看錯誤,因此建議使用>out.txt的方法來記錄命令行信息。

1. 沒有進行任何改動,程序開始運行一閃就自動結束了。

尤其是新手!注意了!很多人一上手就跑程序,成功生成了,但是運行什麼都沒有,就這個問題!HM是需要設置輸入參數和cfg的!

使用HM的肯定都會遇到,一般都是輸入參數或cfg文件的問題,查看輸出的out.txt可以看到相關提示。檢查輸入參數是否正確(閱讀用戶手冊查錯),cfg文件中的輸入YUV地址是否填寫正確,對應位置是否有對應的YUV文件。

 

2. 對代碼進行改動後報錯。

同上,查看輸出的的out.txt看相關提示,找到對應位置進行修正。各類問題很多,就是很基本的C程序調試,不具體說了。

 

3. 運行程序,也不報錯,也沒有正常編碼的提示。

首先還是建議等,因爲很可能是因爲你的機子太慢了,HM還好,如果使用JEM,編一幀都可以睡一覺了,耐心等一下。如果超過幾個小時還不動,那就是程序的問題了,去找錯吧。

 

4.正常編碼輸出的重構圖像打開後如下圖,有兩種可能:

(1)編碼輸入的分辨率錯誤,只能改好重新編碼一下。

(2)cfg中設置的InternalBitDepth爲10,這不是錯誤,無法正常顯示是因爲重構圖像是10bit圖像,而一般YUV播放器只支持8bit圖像,像素值越界。這裏提供一個本人自己改的10bit YUV播放器:http://blog.csdn.net/lin453701006/article/details/79892864。

2.7 針對編碼速度慢問題補充說明

新手肯定對於編碼速度有很多疑問,也有很多人問我這個問題,因此在這裏單獨說明一下。

HM的編碼速度相關的因素:

1.很重要一定要記住,在真正測試時一定要用release版!release相比debug版本速度會快很多,x64也要比x86速度快一些。這個具體原因不深究了,有興趣可以自己研究下。

2.輸入參數,編碼幀數、QP等。建議在檢驗你的代碼是否正確和初步檢測性能優劣時,用較少幀。而QP是公共測試條件限定的,沒法從QP方面入手提高速度。

3.視頻序列的分辨率,這一點很好理解,沒什麼可說的。

4.所有人都能想到,電腦配置也會影響。不過我嘗試過,配置只要夠用,運行速度差異不大,主要還是C++的運行效率限制了運行速度。

 

二、碼流分析軟件

目前HEVC有幾款不錯的碼流分析軟件,CodecVisa,Elecard HEVC Analyzer等,但CodecVisa收費,Elecard HEVC Analyzer可以找到破解版,下面來簡單介紹Elecard HEVC Analyzer的使用方法。

 

Elecard HEVC Analyzer破解版下載地址,內附激活教程(CSDN現在沒法傳免費資源,以後共享資源我儘量用百度雲):

鏈接:https://pan.baidu.com/s/1jJE2W8A 密碼:gmof

 

打開Elecard HEVC Analyzer,然後打開編碼得到的.bin文件。

左上角選擇Chart Bar可以查看每幀視頻碼流分配情況:

Thumbnails查看視頻的縮略圖及對應的編碼索引和時間索引。

 

上方三個按鈕控制顯示塊劃分、預測角度(幀內方向,幀間MV),分塊類型。

 

左側可以看到幀級別的統計信息,比如色度格式、分辨率、各類型幀所分配的比特比例等,下面可以更換查看VPS、SPS等其他級別的信息。

 

右側可以查看CU級別的信息,塊的位置、尺寸、預測方向等等。

 

詳細教程見Elecard自帶的User Guided。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章