清雨影的Blog
搜索文档…
为FFMPEG添加Intel QSV支持

简介

使用CPU转码的速度过于慢,在使用12核心的i7-10710U CPU全力转码也只有75fps的情况下,使用自带的Mesa Intel® UHD Graphics (CML GT2)进行转码在CPU占用率只有1/3的情况下,就可以达到400+fps的转码速度,速度提升了6倍。
但是直接使用apt-get安装的ffmpeg是不带QSV支持的,因为QSV并不是开源的,所以只有自己编译了。
如果完全按照Intel® Quick Sync Video Installation的指示安装,恐怕是要过错年的。文档的格式排版辣眼睛不说,而且连术语都变了,文档让你安装的MediaServerStudio,早已经变成了MediaSDK。

安装Media SDK

首先到Github上下载MediaSDK:https://github.com/Intel-Media-SDK/MediaSDK/releases
当然按照Intel的尿性,下载的位置可能有变化,找不到的时候就参考一下官方页面:Intel® Media SDK
随后解开压缩包,并且执行其中的安装脚本:
1
tar -xzvf MediaStack.tar.gz
2
cd MediaStack
3
chmod +x install_media.sh
4
sudo ./install_media.sh
Copied!
这第一步就算完了。

编译FFMPEG

Intel文档里的这一部分不能说完全正确吧,只能说错漏百出。这里参考ffmpeg的官方的Wiki比较好。
首先安装需要的包:
1
sudo apt-get update -qq && sudo apt-get -y install \
2
autoconf \
3
automake \
4
build-essential \
5
cmake \
6
libass-dev \
7
libfreetype6-dev \
8
libgnutls28-dev \
9
libmp3lame-dev \
10
libsdl2-dev \
11
libtool \
12
libva-dev \
13
libvdpau-dev \
14
libvorbis-dev \
15
libxcb1-dev \
16
libxcb-shm0-dev \
17
libxcb-xfixes0-dev \
18
meson \
19
ninja-build \
20
pkg-config \
21
texinfo \
22
wget \
23
yasm \
24
zlib1g-dev \
25
libunistring-dev \
26
libaom-dev \
27
git-core libdav1d-dev
Copied!
官网文档要求安装这些包,但是我的Ubuntu 20.04找不到libdav1d-dev所以干脆不装了,不影响QSV的使用,git-core也可以不用安装,不过我的机器上已经安装了git了。
之后下载源代码并且生成配置:
1
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
2
tar xjvf ffmpeg-snapshot.tar.bz2
3
cd ffmpeg
4
./configure --enable-libmfx --enable-nonfree | tee config.out
Copied!
这个时候可能会提示:ERROR: libmfx not found
参考这个ISSUE:https://github.com/Intel-Media-SDK/MediaSDK/issues/1822
只需要export PKG_CONFIG_PATH=/opt/intel/mediasdk/lib/pkgconfig/就可以了。
实际情况是,我的电脑是64位,所以应该是:export PKG_CONFIG_PATH=/opt/intel/mediasdk/lib64/pkgconfig
最后直接make就行:
1
make -j 12
Copied!
编译完看一眼支持的codec是不是正确:
1
./ffmpeg -codecs|grep qsv
Copied!
正确的话应该输出类似:
1
ffmpeg version N-105268-g8b9ef5a516 Copyright (c) 2000-2022 the FFmpeg developers
2
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
3
configuration: --enable-libmfx --enable-nonfree
4
libavutil 57. 18.100 / 57. 18.100
5
libavcodec 59. 20.100 / 59. 20.100
6
libavformat 59. 17.100 / 59. 17.100
7
libavdevice 59. 5.100 / 59. 5.100
8
libavfilter 8. 25.100 / 8. 25.100
9
libswscale 6. 5.100 / 6. 5.100
10
libswresample 4. 4.100 / 4. 4.100
11
D.V.L. av1 Alliance for Open Media AV1 (decoders: av1 av1_qsv )
12
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_qsv ) (encoders: h264_qsv h264_v4l2m2m h264_vaapi )
13
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_v4l2m2m ) (encoders: hevc_qsv hevc_v4l2m2m hevc_vaapi )
14
DEVIL. mjpeg Motion JPEG (decoders: mjpeg mjpeg_qsv ) (encoders: mjpeg mjpeg_qsv mjpeg_vaapi )
15
DEV.L. mpeg2video MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_v4l2m2m mpeg2_qsv ) (encoders: mpeg2video mpeg2_qsv mpeg2_vaapi )
16
D.V.L. vc1 SMPTE VC-1 (decoders: vc1 vc1_qsv vc1_v4l2m2m )
17
DEV.L. vp8 On2 VP8 (decoders: vp8 vp8_v4l2m2m vp8_qsv ) (encoders: vp8_v4l2m2m vp8_vaapi )
18
DEV.L. vp9 Google VP9 (decoders: vp9 vp9_v4l2m2m vp9_qsv ) (encoders: vp9_vaapi vp9_qsv )
Copied!

测试

编译出来的ffmpeg就可以直接用了,这时我测试的指令:
1
./ffmpeg -i input.mp4 -init_hw_device qsv=hw -filter_hw_device hw -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -maxrate 5M -movflags +faststart output.mp4
Copied!
在实际测试的过程中,一些选项是不能用的,比如-pix_fmt yuv420p -crf 23这一类的,去掉就可以。

参考资料