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。