Windows/linux版本中QSV 在 FFMPEG 中的使用教程

來源:互聯網
上載者:User

QSV 在 FFMPEG 中的使用(windows)

INDE

在 Windows 下通常使用 INDE 中的 Intel Media SDK 而不是 MMS,因為後者只在 Linux 下和 Windows Server 下可用。

INDE 可以免費下載,建議下載它的離線安裝包,因為很多功能你並不需要,使用離線安裝包,你可以指下載你想要的功能。

安裝 Media SDK

在 Windows 上安裝 Media SDK 比較簡單,請參考這個連結中的安裝方法。我們只使用它做視頻編碼,所以只需要選擇build 下的

- Media SDK for Windows
- Media Raw Acclecerator for Windows
這兩項就可以了。

Windows 下編譯支援 qsv 的 FFMPEG 庫

編譯 mfx_dispatcher

windows 編譯 qsv 之前需要安裝 mfx_dispatcher,它相當於是應用程式和具體的硬體加速庫之間的一個中介層,它負責協助應用庫定位底層代碼,這樣應用庫就可以不用直接連結到硬體加速的具體實現。

[mfx_dispatcher][] 代碼可以在 github 上下載到,在 github 的 README 中也提供了編譯方法。需要注意的是,它使用的編譯工具是 mingw64 的 x86_64 工具鏈,如果你使用的是 mingw64 的 i686 工具庫,記得把教程中的 x86_64替換成 i686。

mfx_dispatcher 安裝完成之後會在 /usr/i686-w64-mingw32/usr/local/ 下產生相應的庫檔案和標頭檔。

連結到 FFMPEG

FFMPEG 需要使用 pkg-config 定位 libmfx 庫,這個庫的 libmfx.pc 檔案在安裝完 mfx_dispatcher 之後會安裝在/usr/i686-w64-mingw32/usr/local/lib/pkgconfig 目錄下。為了讓 FFMPEG 的configure 指令碼能夠找到它你需要把這個地址加入到 PKG_CONFIG_PATH 中。

export PKG_CONFIG_PATH=/usr/i686-w64-mingw32/usr/local/lib/pkgconfig
為了讓 FFMPEG 支援 qsv 你需要加入下面三個配置選項:

./configure --enable-libmfx \
            --enable-encoder=h264_qsv \
            --enable-decoder=h264_qsv \
            ...
使用中可能會出現的問題

在使用 h264_qsv 編碼器的時候,可能會出現 Error initializing an internal MFX session 錯誤,目前沒有找到具體原因。在把 Media SDK 下的libmfxhw32.DLL 檔案拷貝到執行目錄下之後這個問題就消失看。

QSV 在 FFMPEG 中的使用(Linux)

Intel Media SDK

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

目前的 MMS 版本推薦的安裝平台只有一個 CentOS(SUSE12 在目前的版本中也算是一個推薦平台)。其他平台的安裝比較複雜,官方也不太推薦使用。後文的介紹是基於 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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.