第一次面對如此浩大的工程代碼,真的不知如何下手。拜讀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。