日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

硬件编解码开发 linux,Intel平台硬件加速视频编解码开发

發布時間:2023/12/20 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 硬件编解码开发 linux,Intel平台硬件加速视频编解码开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

視頻編解碼分為硬件加速以及非硬件加速。硬件加速是指通過顯卡,FPGA等硬件進行視頻編解碼,由于硬件有專門優化,所以性能高,能耗低,非硬件加速編解碼是指通過CPU進行視頻編解碼,性能就沒那么高(雖然有相關CPU指令優化),由于視頻編解碼計算量很大,所以能耗也很高。在PC平臺上主流的硬件加速編解碼有Intel集成顯卡,Nvidia顯卡。Nvidia平臺的編解碼用的比較多,網上資料也多,接口也很簡單,但是相對成本會高些。Intel集顯平臺視頻編解碼成本就低很多了,只要是最近幾年帶集顯的CPU基本都支持硬件加速編解碼,但是開發復雜度相對高些,網上資料也少,主要是用的人少吧。自己做過Intel集顯平臺在Linux以及Windows下的編解碼開發,也踩過很多坑,故特地寫此文章,介紹下Intel集顯平臺的視頻編解碼開發,希望更多的人能加入Intel平臺視頻編解碼,降低成本開銷。

Quick Sync Video

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

可以看到該顯卡支持Intel Quick Sync Video。點擊Quick Sync Video旁的Info提示:

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

所以看到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以及libmfx。

VAAPI (視頻加速API,Video Acceleration API)包含一套開源的庫(LibVA) 以及API規范, 用于硬件加速下的視頻編解碼以及處理,只有Linux上的驅動提供支持。

libmfx。Intel Media SDK中的API規范,支持視頻編解碼以及媒體處理。支持Windows以及Linux。

除了Intel自己的API,在Windows系統上還有其他API可使用Intel GPU的硬件加速能力,這些API屬于Windows標準,由Intel顯卡驅動實現。

DXVA2 / D3D11VA。標準Windows API,支持通過Intel顯卡驅動進行視頻編解碼,FFmpeg有對應實現。

Media Foundation。標準Windows API,支持通過Intel顯卡驅動進行視頻編解碼,FFmpeg不支持該API。

Intel媒體棧

基于Intel顯卡技術,Intel媒體棧提供了一系列多媒體解決方案。例如:Intel Media driver(也稱作iHD driver),Intel Media SDK, LibVA等。

下圖為Intel媒體棧的各個組件示意圖:

后面說下跟我們視頻編解碼關系比較大的。

VAAPI驅動

VAAPI驅動屬于用戶態驅動,用于支持LibVA,底層是i965/1915驅動。Intel提供了兩種開源的VAAPI驅動:intel-vaapi-driver以及intel-media-driver,intel-media-driver較intel-vaapi-driver新,維護更積極,所以目前更推薦使用intel-media-driver。

開發庫以及SDK

LibVA:VAAPI的開源庫實現

LibVA-utils:VAAPI相關的一系列工具以及示例

Intel Media SDK:提供一套用于視頻編解碼以及處理(VPP)的API:libmfx,支持Linux/Windows,具體介紹可查看:Intel Media SDK

開發環境搭建

前面簡單介紹了VAAPI以及Intel Media SDK,下面說下開發環境搭建。

Windows系統

只有Intel Media SDK支持。確保安裝了集成顯卡驅動,然后需要到Intel官網下載Intel Media SDK安裝包。具體搭建請參考:

Intel Media SDK環境搭建:https://blog.csdn.net/y601500359/article/details/87169715

Linux系統

包含Ubuntu以及CentOS。需要安裝驅動以及相應的庫。

FFmpeg VAAPI/QSV開發環境搭建

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

FFmpeg-vaapi插件:基于VAAPI接口

FFmpeg-qsv插件:基于Intel Media SDK

FFmpeg VAAPI/QSV開發環境搭建我就不做搬運工了,大家可參考官網教程。

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

不使用FFmpeg的開發環境搭建

有些人可能不想使用FFmpeg,對于Intel Media SDK還好,但是VAAPI就不行了,接口設計很底層,且復雜,所以對于想使用VAAPI的話,還是老老實實使用FFmpeg吧,時間就是金錢。

對于Intel Media SDK,除了可以編解碼,還有可以進行視頻的其他操作。2017年開始,Linux上才有開源的Intel Media SDK實現,之前Linux上的對應方案叫做Intel? Media Server Studio,現在已經不可用了。

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

所以開發環境搭建還是參考上一小節的內容,只是可以選擇不編譯安裝FFmpeg。

注意事項

安裝的LibVA-utils包含一個vainfo工具,前面的開發環境搭建后,可以通過vainfo檢查VAAPI的安裝設置。

[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

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@localhostapps]# vainfo

libvainfo:VA-APIversion1.6.0

libvainfo:va_getDriverName()returns0

libvainfo:Userrequesteddriver'iHD'

libvainfo:Tryingtoopen/usr/lib/dri/iHD_drv_video.so

libvainfo:Foundinitfunction__vaDriverInit_1_5

libvainfo:va_openDriver()returns0

vainfo:VA-APIversion:1.6(libva2.5.0)

vainfo:Driverversion:InteliHDdriver-1.0.0

vainfo:Supportedprofileandentrypoints

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),這個在設置:

#export LIBVA_DRIVER_NAME=iHD時指定,設置iHD驅動在一些情況下能獲得更高的編解碼性能。VAEntrypointVLD 指的是顯卡能夠解碼這個格式,VAEntrypointEncSlice 指的是顯卡可以編碼這個格式。

如果運行vainfo出現如下錯誤:

libva info: va_openDriver() returns -1

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

1

2

libvainfo:va_openDriver()returns-1

vaInitializefailedwitherrorcode-1(unknownlibvaerror),exit

說明驅動沒設置正確,確保驅動都正常編譯到指定目錄,且驅動名稱及路徑:

#export LIBVA_DRIVER_NAME=iHD

#export LIBVA_DRIVERS_PATH=$ROOT_INSTALL_DIR/lib/dri

1

2

#export LIBVA_DRIVER_NAME=iHD

#export LIBVA_DRIVERS_PATH=$ROOT_INSTALL_DIR/lib/dri

設置正確。

示例代碼

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輸入參數得是FFmpeg注冊的vaapi編碼器名稱,例如

h264的vaapi編碼器是:h264_vaapi,可通過ffmpeg -codecs | grep vaapi命令查詢;

2)av_hwdevice_ctx_create輸入的設備名是/dev/dri/renderD128這樣的形式,可通過ls /dev/dri查詢,這里的示例/dev/dri/renderD128表示Intel集顯設備;

3)VAAPI編碼時,輸入的YUV格式必須是NV12,其他格式YUV得轉為NV12格式。vaapi_encode.c有個AVFrame(sw_frame),用于存放我們輸入的YUV數據,該AVFrame的data[0]用于存放Y數據,data[1]存放UV數據,由于輸入格式是NV12,所以data[1]中UV數據的內存布局為: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.

總結

以上是生活随笔為你收集整理的硬件编解码开发 linux,Intel平台硬件加速视频编解码开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。