最近折騰intel media sdk,主要硬件平台是在HD4600的核顯上進行測試,intel media sdk是intel提供的一種基於核顯的硬件編解碼的解決方案,之前已經有使用ffmpeg進行了測試,可以極大的降低CPU的使用情況。只與編解碼出來的畫質如何,並沒有做多大的對比。從其官方文檔來看,可以支持的近9路1080P(H264)的轉碼。但是對H265的支持,則需要專業版才行,通過so插件擴展的方式才能編解碼成功。因此主要做的還是H264的編解碼測試。
其提供的samples代碼,是使用C++寫的,功能很是完善,我這邊是在centos7.1(使用ubuntu安裝過,不過穩定性不敢恭維,不介意內核經常掛掉的,可以在ubuntu上測試),也就是官方文檔中推薦的操作系統上做的一些測試。下面會簡單說一下幾個測試。
首先,解壓了samples的代碼后,在每個模塊的源碼中,都有幾個readme-xxx.pdf的文檔,也就是對應模塊的readme說明文檔。有詳細說明了對應模塊的參數,以及使用示例等,對后面做簡單的測試,還是很有幫助的,下文只是對sample做一個簡單的說明,並沒有readme中的文檔詳細。
測試,主要有幾個,一個是sample_decode,也就是解碼的sample;一個是sample_encode,也就是編碼的sample;一個是sample_vpp,是視頻圖像處理的sample;還一個是sample_multi_transcode,做的是編碼轉換的一個工作。配合intel_gou_top對gpu的使用情況進行關注。
帶上-vaapi參數,則說明使用的是顯存的數據,這里沒有-o做輸出,sample_decode的代碼是可以不用輸出參數的。解碼會以最高的GPU使用率進行輸出。如果是有輸出文件,輸出為yuv的文件,默認nv12格式的yuv數據。
由於輸入是yuv的數據文件,yuv是不包含分辨率信息的,因此必須-w 寬 -h 高,來告知編碼器需要進行編碼的分辨率大小是多少。
sample_vpp則是作為視頻合成,視頻縮放等視頻處理的操作,輸入為yuv的數據,輸出為處理后的yuv的數據,可以通過配置文件的方式,對數據進行多路合成。目前合成一個1080P 2×2的視頻圖像。由於yuv文件相對較大,因此合成的時候,都使用同一個輸入源。
執行操作命令如下:
如果想要查看輸入文件的合成情況,可以使用ffplay進行播放:
而由於輸入是yuv的數據,數據量比較大,而輸出也是yuv的數據,其實vpp的操作,用顯存進行操作,反倒效率會比較低,畢竟需要將內存的yuv數據拷貝到顯存,然后合成后的顯存數據再拷貝到內存。所以可以將-vaapi參數去掉。
sample_multi_transcode是可以執行多路的轉碼,可以將一個文件作為解碼后的輸入源,根據這個源再做其余的轉碼,有個join session的概念,據說join的操作,可以提高不少的效率,具體多少,這個還沒研究太深。
這邊的配置,1080P_30fps.264解碼后作為后面幾個的輸入源,-i::sink說明其作為輸出源,而后面兩個-i::source,則說明使用-o::sink作為輸入源。
執行的話,只需要執行
執行期間,都可以通過intel_gpu_top進行對gpu使用情況的查看。intel提供的sample代碼已經將所有的API都有做了相關的演示,可以很方便的對API進行一個理解以及自己往上面添加log之類的操作,可以很好的調試一些信息。整體來說,實現了一個GPU該有的大部分功能。有初步做了一些測試,編解碼/VPP操作一個分辨率的視頻,GPU使用情況是編碼>解碼>VPP。
轉載請注明: 轉載自elkPi