英特爾 QSV 在 FFMPEG 中的使用(Linux)

Intel Media SDK

現在 Intel 不再發布單獨的 Intel Media SDK, 這個組件在 Linux 平臺下集成在 Intel Media Server Studio 中,後文簡稱 MMS

目前的 MMS 版本推薦的安裝平臺只有一個 CentOSSUSE12 在當前版本中也算是一個推薦平臺)。其他平臺的安裝比較複雜,官方也不太推薦使用。後文的介紹是基於 CentOS 操作系統的。

如何安裝 MMS

首先,你需要在 Intel Developer Zone 下載最新的 MMS 版本,其中的 Community 版本是免費的, MMS 的安裝主要分三個步驟。

在解壓出來的的文件夾下面有一個 SDK2015Production* 目錄,切換到這個目錄下面之後,有一個 CentOS 目錄。這個目錄下面有一個intel_scripts_centos*壓縮包,解壓這個壓縮包之後可以得到下面三個腳本:

-build_kernel_rpm_CentOS.sh
-install_sdk_UMD_CentOS.sh
-uninstall_sdk_UMD_CentOS.sh

安裝需要用的是前面兩個腳本。

1. 安卓用戶空間驅動(user-mode driver – UMD)

下面的命令需要使用超級用戶權限:

./install_sdk_UMD_CentOS.sh

mkdir /MSS

chown {普通用戶名}:{普通組名} /MSS

2. 編譯內核空間的驅動包

下面的命令使用普通用戶權限執行:

cp build_kernel_rpm_CentOS.sh /MSS

cd /MSS

./build_kernel_rpm*.sh

3. 安裝內核空間的驅動

下面的命令使用超級用戶權限執行:

cd /MSS/rpmbuild/RPMS/x86_64

rpm -Uvh kernel-3.10.*.rpm

reboot

判斷是否已經成功的編譯內核模塊驅動

重啓系統之後執行如下命令:

lsmod | grep 'i915'

得到的類似如下的結果:

i915                837369 4
drm_kms_helper      44256 1 i915
drm                 294746 3 i915,drm_kms_helper
i2c_algo_bit        13509 1 i915
intel_gtt           19747 1 i915
i2c_core            40683 5
i2c_i801,i915,drm_kms_helper,drm,i2c_algo_bit
video               19785 1 i915
button              13953 1 i915

如何在 FFMPEG 中編譯 intel qsv 硬件編碼器

FFMPEG 中使用 libmfx 實現 intel qsv 的硬件編碼器,如果想要編譯它的硬件編碼器,所以如果想要編譯這個硬件編碼器,你需要在加入如下的配置選項:

./configure --enable-libmfx \
            --enable-encoder=h264_qsv \
            --enable-decoder=h264_qsv \
            ...

libmfx can not found using pkg-config

libmfx.pc

編譯中可能會報出下面的錯誤: libmfx can not found using pkg-config,這個錯誤可能是不同的原因導致,你需要查看 ffmpeg 根目錄下的config.log 文件。

如果這個文件中報錯說 pkg-config 無法找到 libmfx 這個庫,那是因爲 MMS 的默認安裝沒有提供 libmfx.pc 文件,你需要在自己創建這個文件:

sudo mkdir -p /opt/intel/mediasdk/pkgconfig

vim /opt/intel/mediasdk/lib64/pkgconfig/libmfx.pc

在文件中寫入如下內容:

prefix=/opt/intel/mediasdk
exec_prefix=${prefix}
libdir=${exec_prefix}/lib64
includedir=${exec_prefix}/include

Name: libmfxhw64

Description: Intel Media SDK dispatcher.
Version: 2015r6
Libs: -L${libdir} -lmfxhw64
Cflags: -I${includedir}

注意這個地方引用的是 libmfxhw64 庫,因爲測試的是 64 位平臺。

當然你可以可以選擇在 /usr/lib64/pkgconfig/ 下面創建 libmfx.pc 文件。

mfx/mfxvideo.h

同樣是 libmfx can not found using pkg-config 這個命令,也可能是頭文件的錯誤,在 config.log 中會報錯說無法找到 mfx/mfxvideo.h 這個文件。

在安裝完 MMS 之後,在 /opt/intel/mediasdk/include/ 目錄下面會有mfxvideo.h 這個文件,但是在 FFMPEG 中,引用的是 mfx/mfxvideo.h 這個頭文件,因此報錯,解決的方式是,在 /opt/intel/mediasdk/include 這個目錄下面新建目錄 mfx,然後吧 include 的頭文件拷貝一份到 mfx 目錄下。

通過上面這種方式可以修正 mfx/mfxvideo.h 無法找到的錯誤。

鏈接 FFMPEG 時的錯誤

在鏈接 ffmpeg 的時候還是有可能會出現 MFXxxx undefinded reference 的錯誤,這時候你需要讓你的程序鏈接到 lmfxhw64 這個庫。最簡單的方式是,在/usr/lib64/ 中建立一個 libmfxhw64 的軟連接

ln -s /opt/intel/mediasdk/lib64/libmfxhw64.so /usr/lib64/libmfxhw64.so

然後在編譯自己的程序的時候加入 -lmfxhw64 選項。

在 FFMPEG 中使用 qsv 編碼器

qsv 的編碼器在 FFMPEG 中有 h264 和 h265 兩種,你可以通過下面的代碼找到這個編碼器。

av_find_encoder_by_name("h264_qsv");

此外,通過 qsvenc_h264.c 這個源文件,我們可以看到它支持 QSV 和 NV12兩種格式,但是 QSV 這個格式好像無法正常的使用,你需要把編碼的pfx_fmt設置成 NV12

發佈了121 篇原創文章 · 獲贊 51 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章