Intel MediaSDK

原文:https://blog.jianchihu.net/intel-gpu-hw-video-codec-develop.html

視頻編解碼分為硬件加速以及非硬件加速沈撞。硬件加速是指通過顯卡碘梢,F(xiàn)PGA等硬件進(jìn)行視頻編解碼,由于硬件有專門優(yōu)化,所以性能高唯笙,能耗低,非硬件加速編解碼是指通過CPU進(jìn)行視頻編解碼萄窜,性能就沒那么高(雖然有相關(guān)CPU指令優(yōu)化)诈泼,由于視頻編解碼計(jì)算量很大,所以能耗也很高捅儒。在PC平臺上主流的硬件加速編解碼有Intel集成顯卡液样,Nvidia顯卡振亮。Nvidia平臺的編解碼用的比較多,網(wǎng)上資料也多鞭莽,接口也很簡單坊秸,但是相對成本會高些。Intel集顯平臺視頻編解碼成本就低很多了澎怒,只要是最近幾年帶集顯的CPU基本都支持硬件加速編解碼褒搔,但是開發(fā)復(fù)雜度相對高些,網(wǎng)上資料也少喷面,主要是用的人少吧星瘾。自己做過Intel集顯平臺在Linux以及Windows下的編解碼開發(fā),也踩過很多坑惧辈,故特地寫此文章琳状,介紹下Intel集顯平臺的視頻編解碼開發(fā),希望更多的人能加入Intel平臺視頻編解碼盒齿,降低成本開銷念逞。

Quick Sync Video

Intel Quick Sync Video(QSV)是Intel GPU上跟視頻處理有關(guān)的一系列硬件特性的稱呼。如下是Intel官網(wǎng)某款CPU帶的顯卡規(guī)格:

image

可以看到該顯卡支持Intel Quick Sync Video边翁。點(diǎn)擊Quick Sync Video旁的Info提示:

英特爾? Quick Sync Video 技術(shù)可以快速轉(zhuǎn)換便攜式多媒體播放器的視頻翎承,還能提供在線共享、視頻編輯及視頻制作功能符匾。

所以看到CPU帶的集成顯卡支持Quick Sync Video就表示支持硬件加速的視頻編解碼叨咖。

硬件支持

看下Intel不同代處理器對視頻編碼格式的支持情況。

| Platform Name | Graphics | Adds support for... |
| Ironlake | gen5 | MPEG-2, H.264 decode. |
| Sandy Bridge | gen6 | VC-1 decode; H.264 encode. |
| Ivy Bridge | gen7 | JPEG decode; MPEG-2 encode. |
| Bay Trail | gen7 | - |
| Haswell | gen7.5 | - |
| Broadwell | gen8 | VP8 decode. |
| Braswell | gen8 | H.265 decode; JPEG, VP8 encode. |
| Skylake | gen9 | H.265 encode. |
| Apollo Lake | gen9 | VP9, H.265 Main10 decode. |
| Kaby Lake | gen9.5 | VP9 profile 2 decode; VP9, H.265 Main10 encode. |
| Coffee Lake | gen9.5 | - |
| Gemini Lake | gen9.5 | - |
| Cannonlake | gen10 | - |

可以看到從第五代開始就支持硬件加速視頻編解碼了待讳,越往后支持的視頻編碼格式以及特性也逐漸增多芒澜。

API支持

在不同平臺上可通過不同API使用Intel GPU的硬件加速能力。目前主要由兩套API:VAAPI以及l(fā)ibmfx创淡。

  • VAAPI (視頻加速API痴晦,Video Acceleration API)包含一套開源的庫(LibVA) 以及API規(guī)范, 用于硬件加速下的視頻編解碼以及處理,只有Linux上的驅(qū)動提供支持琳彩。
  • libmfx誊酌。Intel Media SDK中的API規(guī)范,支持視頻編解碼以及媒體處理露乏。支持Windows以及Linux碧浊。

除了Intel自己的API,在Windows系統(tǒng)上還有其他API可使用Intel GPU的硬件加速能力瘟仿,這些API屬于Windows標(biāo)準(zhǔn)箱锐,由Intel顯卡驅(qū)動實(shí)現(xiàn)。

  • DXVA2 / D3D11VA劳较。標(biāo)準(zhǔn)Windows API驹止,支持通過Intel顯卡驅(qū)動進(jìn)行視頻編解碼浩聋,F(xiàn)Fmpeg有對應(yīng)實(shí)現(xiàn)。
  • Media Foundation臊恋。標(biāo)準(zhǔn)Windows API衣洁,支持通過Intel顯卡驅(qū)動進(jìn)行視頻編解碼,F(xiàn)Fmpeg不支持該API抖仅。

Intel媒體棧

基于Intel顯卡技術(shù)坊夫,Intel媒體棧提供了一系列多媒體解決方案。例如:Intel Media driver(也稱作iHD driver)撤卢,Intel Media SDK, LibVA等环凿。
下圖為Intel媒體棧的各個(gè)組件示意圖:


image

后面說下跟我們視頻編解碼關(guān)系比較大的。

VAAPI驅(qū)動

VAAPI驅(qū)動屬于用戶態(tài)驅(qū)動凸丸,用于支持LibVA拷邢,底層是i965/1915驅(qū)動。Intel提供了兩種開源的VAAPI驅(qū)動:intel-vaapi-driver以及intel-media-driver屎慢,intel-media-driver較intel-vaapi-driver新,維護(hù)更積極忽洛,所以目前更推薦使用intel-media-driver腻惠。

開發(fā)庫以及SDK

LibVA:VAAPI的開源庫實(shí)現(xiàn)
LibVA-utils:VAAPI相關(guān)的一系列工具以及示例
Intel Media SDK:提供一套用于視頻編解碼以及處理(VPP)的API:libmfx,支持Linux/Windows欲虚,具體介紹可查看:Intel Media SDK

開發(fā)環(huán)境搭建

前面簡單介紹了VAAPI以及Intel Media SDK集灌,下面說下開發(fā)環(huán)境搭建。

Windows系統(tǒng)

只有Intel Media SDK支持复哆。確保安裝了集成顯卡驅(qū)動欣喧,然后需要到Intel官網(wǎng)下載Intel Media SDK安裝包。具體搭建請參考:

Intel Media SDK環(huán)境搭建:https://blog.csdn.net/y601500359/article/details/87169715

Linux系統(tǒng)

包含Ubuntu以及CentOS梯找。需要安裝驅(qū)動以及相應(yīng)的庫唆阿。

FFmpeg VAAPI/QSV開發(fā)環(huán)境搭建

對于VAAPI以及Intel Media SDK,如果使用原生API開發(fā)的話比較麻煩锈锤,好在FFmpeg提供了對應(yīng)的插件驯鳖。我們可以通過FFmpeg間接使用這兩套API。在FFmpeg中VAAPI還是叫做VAAPI久免,但是Intel Media SDK卻叫做QSV(一臉懵逼)浅辙。

FFmpeg-vaapi插件:基于VAAPI接口
FFmpeg-qsv插件:基于Intel Media SDK

FFmpeg VAAPI/QSV開發(fā)環(huán)境搭建我就不做搬運(yùn)工了,大家可參考官網(wǎng)教程阎姥。

Linux FFmpeg VAAPI/QSV Installation Environment:https://01.org/linuxmedia/quickstart/ffmpeg-vaapi-qsv-installation-environment

不使用FFmpeg的開發(fā)環(huán)境搭建

有些人可能不想使用FFmpeg记舆,對于Intel Media SDK還好,但是VAAPI就不行了呼巴,接口設(shè)計(jì)很底層泽腮,且復(fù)雜御蒲,所以對于想使用VAAPI的話,還是老老實(shí)實(shí)使用FFmpeg吧盛正,時(shí)間就是金錢删咱。

對于Intel Media SDK,除了可以編解碼豪筝,還有可以進(jìn)行視頻的其他操作痰滋。2017年開始,Linux上才有開源的Intel Media SDK實(shí)現(xiàn),之前Linux上的對應(yīng)方案叫做Intel? Media Server Studio续崖,現(xiàn)在已經(jīng)不可用了敲街。

Linux上的Intel Media SDK底層基于Libva。編譯Intel Media SDK也是要安裝VAAPI驅(qū)動等Intel媒體棧軟件严望。


image

所以開發(fā)環(huán)境搭建還是參考上一小節(jié)的內(nèi)容多艇,只是可以選擇不編譯安裝FFmpeg。

注意事項(xiàng)

安裝的LibVA-utils包含一個(gè)vainfo工具像吻,前面的開發(fā)環(huán)境搭建后峻黍,可以通過vainfo檢查VAAPI的安裝設(shè)置。

<textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly="" style="box-sizing: border-box; margin: 0px; font-family: Monaco, MonacoRegular, "Courier New", monospace !important; font-size: 13px !important; line-height: 20px !important; overflow: hidden; resize: none; width: 783.328px; padding: 0px 5px; height: 867.5px; position: absolute; opacity: 0; border: 0px; border-radius: 0px; box-shadow: none; white-space: pre; overflow-wrap: normal; color: rgb(0, 0, 0); background: rgb(255, 255, 255); tab-size: 4; z-index: 0;"></textarea>

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

|

[root@localhost apps]# vainfo

libva info: VA-API version 1.6.0

libva info: va_getDriverName() returns 0

libva info: User requested driver 'iHD'

libva info: Trying to open /usr/lib/dri/iHD_drv_video.so

libva info: Found init function __vaDriverInit_1_5

libva info: va_openDriver() returns 0

vainfo: VA-API version: 1.6 (libva 2.5.0)

vainfo: Driver version: Intel iHD driver - 1.0.0

vainfo: Supported profile and entrypoints

  VAProfileNone :    VAEntrypointVideoProc

  VAProfileNone :    VAEntrypointStats

  VAProfileMPEG2Simple            :    VAEntrypointVLD

  VAProfileMPEG2Simple            :    VAEntrypointEncSlice

  VAProfileMPEG2Main              :    VAEntrypointVLD

  VAProfileMPEG2Main              :    VAEntrypointEncSlice

  VAProfileH264Main :    VAEntrypointVLD

  VAProfileH264Main :    VAEntrypointEncSlice

  VAProfileH264Main :    VAEntrypointFEI

  VAProfileH264Main :    VAEntrypointEncSliceLP

  VAProfileH264High :    VAEntrypointVLD

  VAProfileH264High :    VAEntrypointEncSlice

  VAProfileH264High :    VAEntrypointFEI

  VAProfileH264High :    VAEntrypointEncSliceLP

  VAProfileVC1Simple              :    VAEntrypointVLD

  VAProfileVC1Main                :    VAEntrypointVLD

  VAProfileVC1Advanced            :    VAEntrypointVLD

  VAProfileJPEGBaseline :    VAEntrypointVLD

  VAProfileJPEGBaseline :    VAEntrypointEncPicture

  VAProfileH264ConstrainedBaseline:    VAEntrypointVLD

  VAProfileH264ConstrainedBaseline:    VAEntrypointEncSlice

  VAProfileH264ConstrainedBaseline:    VAEntrypointFEI

  VAProfileH264ConstrainedBaseline:    VAEntrypointEncSliceLP

  VAProfileVP8Version0_3          :    VAEntrypointVLD

  VAProfileVP8Version0_3          :    VAEntrypointEncSlice

  VAProfileHEVCMain :    VAEntrypointVLD

  VAProfileHEVCMain :    VAEntrypointEncSlice

  VAProfileHEVCMain :    VAEntrypointFEI

  VAProfileHEVCMain10 :    VAEntrypointVLD

  VAProfileHEVCMain10 :    VAEntrypointEncSlice

  VAProfileVP9Profile0            :    VAEntrypointVLD

  VAProfileVP9Profile2            :    VAEntrypointVLD

|

正常的輸出類似上面拨匆,我們用到的是Intel iHD driver(即Intel Media driver)姆涩,這個(gè)在設(shè)置:
#export LIBVA_DRIVER_NAME=iHD時(shí)指定,設(shè)置iHD驅(qū)動在一些情況下能獲得更高的編解碼性能惭每。VAEntrypointVLD 指的是顯卡能夠解碼這個(gè)格式骨饿,VAEntrypointEncSlice 指的是顯卡可以編碼這個(gè)格式。

如果運(yùn)行vainfo出現(xiàn)如下錯(cuò)誤:

<textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly="" style="box-sizing: border-box; margin: 0px; font-family: Monaco, MonacoRegular, "Courier New", monospace !important; font-size: 13px !important; line-height: 20px !important; overflow: hidden; resize: none; width: 783.328px; padding: 0px 5px; height: 67.5px; position: absolute; opacity: 0; border: 0px; border-radius: 0px; box-shadow: none; white-space: pre; overflow-wrap: normal; color: rgb(0, 0, 0); background: rgb(255, 255, 255); tab-size: 4; z-index: 0;"></textarea>

|

1

2

|

libva info: va_openDriver() returns -1

vaInitialize failed with error code -1 (unknown libva error),exit

|

說明驅(qū)動沒設(shè)置正確台腥,確保驅(qū)動都正常編譯到指定目錄宏赘,且驅(qū)動名稱及路徑:

<textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly="" style="box-sizing: border-box; margin: 0px; font-family: Monaco, MonacoRegular, "Courier New", monospace !important; font-size: 13px !important; line-height: 20px !important; overflow: hidden; resize: none; width: 783.328px; padding: 0px 5px; height: 67.5px; position: absolute; opacity: 0; border: 0px; border-radius: 0px; box-shadow: none; white-space: pre; overflow-wrap: normal; color: rgb(0, 0, 0); background: rgb(255, 255, 255); tab-size: 4; z-index: 0;"></textarea>

|

1

2

|

export LIBVA_DRIVER_NAME=iHD

export LIBVA_DRIVERS_PATH=$ROOT_INSTALL_DIR/lib/dri

|

設(shè)置正確。

示例代碼

Intel Media SDK:https://github.com/Intel-Media-SDK/MediaSDK/tree/master/samples

ffmpeg-VAAPI:FFmpeg源碼目錄doc\examples下的vaapi_encode.cpp與vaapi_transcode.c

1)示例代碼中黎侈,avcodec_find_encoder_by_name輸入?yún)?shù)得是FFmpeg注冊的vaapi編碼器名稱察署,例如
h264的vaapi編碼器是:h264_vaapi,可通過ffmpeg -codecs | grep vaapi命令查詢蜓竹;
2)av_hwdevice_ctx_create輸入的設(shè)備名是/dev/dri/renderD128這樣的形式箕母,可通過ls /dev/dri查詢,這里的示例/dev/dri/renderD128表示Intel集顯設(shè)備俱济;
3)VAAPI編碼時(shí)嘶是,輸入的YUV格式必須是NV12,其他格式Y(jié)UV得轉(zhuǎn)為NV12格式蛛碌。vaapi_encode.c有個(gè)AVFrame(sw_frame)聂喇,用于存放我們輸入的YUV數(shù)據(jù),該AVFramedata[0]用于存放Y數(shù)據(jù),data[1]存放UV數(shù)據(jù)希太,由于輸入格式是NV12克饶,所以data[1]中UV數(shù)據(jù)的內(nèi)存布局為:UVUVUVUV···UVUV

FFmpeg-QSV:FFmpeg源碼目錄doc\examples下的qsvdec.c

參考

[1] Linux FFmpeg VAAPI/QSV Installation Environment.https://01.org/zh/linuxmedia/quickstart/ffmpeg-vaapi-qsv-installation-environment?langredirect=1.
[2] Intel media for linux.https://01.org/zh/intel-media-for-linux?langredirect=1.
[3]Linux media.https://01.org/zh/linuxmedia?langredirect=1.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末誊辉,一起剝皮案震驚了整個(gè)濱河市矾湃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堕澄,老刑警劉巖邀跃,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛙紫,居然都是意外死亡拍屑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門坑傅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僵驰,“玉大人,你說我怎么就攤上這事唁毒∷廛睿” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵浆西,是天一觀的道長矮男。 經(jīng)常有香客問我,道長室谚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任崔泵,我火速辦了婚禮秒赤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憎瘸。我一直安慰自己入篮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布幌甘。 她就那樣靜靜地躺著潮售,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锅风。 梳的紋絲不亂的頭發(fā)上酥诽,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音皱埠,去河邊找鬼肮帐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的训枢。 我是一名探鬼主播托修,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恒界!你這毒婦竟也來了睦刃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤十酣,失蹤者是張志新(化名)和其女友劉穎涩拙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婆誓,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吃环,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洋幻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郁轻。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖文留,靈堂內(nèi)的尸體忽然破棺而出好唯,到底是詐尸還是另有隱情,我是刑警寧澤燥翅,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布骑篙,位于F島的核電站,受9級特大地震影響森书,放射性物質(zhì)發(fā)生泄漏靶端。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一凛膏、第九天 我趴在偏房一處隱蔽的房頂上張望杨名。 院中可真熱鬧,春花似錦猖毫、人聲如沸台谍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趁蕊。三九已至,卻和暖如春仔役,著一層夾襖步出監(jiān)牢的瞬間掷伙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工骂因, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炎咖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像乘盼,于是被迫代替她去往敵國和親升熊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容