使用ffmpeg支持Intel核显的硬件编解码

ffmpeg本身已支持对各类显卡的使用,显卡的驱动也已在Debian11安装时被安装完毕,在Debian11上使用Intel的核显功能仅需使用ffmpeg的指定参数

安装ffmpeg

apt-get install ffmpeg

识别是否支持GPU(仅Intel)

2.1.5. 图形卡支持
Debian 能支持的显卡取决于底层的 X.Org's X11 的支持。流行的 PC 上,图形显示器通常工作地很好。至于高级的显卡功能,比如 3D 硬件加速或硬件视频加速是否可用,由系统所使用的具体显示硬件和所要安装的额外“固件(firmware)”决定(参阅第 2.2 节 “需要固件的设备”)。极个别的情况下使用基本的显示功能也需要安装额外的固件,但这是罕有的例子。

在现代 PC 上,显卡通常可以开箱即用。极少情况下也有关于硬件的报告称,即使是使用基本的图像支持,也需要安装额外的显卡固件,但这些都是罕见的例外。对于相当多的硬件,3D 加速也能开箱即用,但仍有一些硬件需要二进制 blob 才能正常工作。

对显卡和其他定点设备的具体支持情况,见 https://wiki.freedesktop.org/xorg/
Debian 11 包含 X.Org 7.7 版。

获取视频信息

ffprobe test.flv

结果为

ffprobe version 4.3.3-0+deb11u1 Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 10 (Debian 10.2.1-6)
  configuration: --prefix=/usr --extra-version=0+deb11u1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, flv, from 'test.flv':
  Metadata:
    description     : Bilibili VXCode Swarm Transcoder v0.6.11
    metadatacreator : Version 1.9
    hasKeyframes    : true
    hasVideo        : true
    hasAudio        : true
    hasMetadata     : true
    canSeekToEnd    : true
    datasize        : 117099586
    videosize       : 110052428
    audiosize       : 6998746
    lasttimestamp   : 168
    lastkeyframetimestamp: 168
    lastkeyframelocation: 117100861
  Duration: 00:02:48.46, start: 0.120000, bitrate: 5560 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 5229 kb/s, 25.03 fps, 25 tbr, 1k tbn, 50 tbc
    Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp, 328 kb/s

其中的Duration是视频时长,Stream #0:0后含有编码、分辨率等信息

获取更详细的视频信息

ffprobe -v error -show_streams -print_format json test.flv
字段 说明
index 流所在的索引
codec_name 编码名
codec_long_name 编码全名
profile 编码的profile
level 编码的level
has_b_frame 包含B帧信息
codec_type 编码类型
codec_time_base 编码的时间戳计算基础单位
pix_fmt 图像显示的色彩格式
coded_width 图像的宽度
coded_height 图像的高度
codec_tag_string 编码的标签数据
r_frame_rate 实际帧率
avg_frame_rate 平均帧率
time_base 时间基数(用来计算timestamp)
bit_rate 码率
max_bit_rate 最大码率
nb_frames 帧数

生成视频截图(硬件加速)

以一个名为test.flv的源视频为例,获取视频截图,这是一个耗时操作,建议采用队列处理多个视频同时生成截图

ffmpeg -hwaccel qsv -i test.flv -vf "select=gt(scene\,0.3)" -s 352x240 -frames:v 1 test.jpg -y

其中

生成视频截图

在不能使用硬件加速的情况下,可以使用软件(即CPU)来截图,以一个名为test.flv的源视频为例,获取视频截图,这是一个耗时操作,建议采用队列处理多个视频同时生成截图

ffmpeg -i test.flv -threads 1 -vf "select=gt(scene\,0.3)" -s 352x240 -frames:v 1 test.jpg -y

其中

视频转码(硬件加速)

以一个名为test.flv的源视频为例,转换成1080P的视频

ffmpeg -hwaccel qsv -c:v h264_qsv -i test.flv -vcodec h264_qsv -vf scale_qsv=1920:1080 -f mp4 test.mp4 -y

其中

解码器名称 说明
h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
hevc_qsv HEVC (Intel Quick Sync Video acceleration) (codec hevc)
mjpeg_qsv MJPEG video (Intel Quick Sync Video acceleration) (codec mjpeg)
mpeg2_qsv MPEG-2 video (Intel Quick Sync Video acceleration) (codec mpeg2video)
vc1_qsv VC-1 video (Intel Quick Sync Video acceleration) (codec vc1)
vp8_qsv VP8 video (Intel Quick Sync Video acceleration) (codec vp8)
vp9_qsv VP9 video (Intel Quick Sync Video acceleration) (codec vp9)

注意,设备的GPU对编解码器的支持有多有少,因此就算使用了正确的解码器进行解码,也可能因为硬件不支持失败,此时可以不使用硬件加速

视频转码

在不能使用硬件加速的情况下,可以使用软件(即CPU)来转码,以一个名为test.flv的源视频为例,转换成1080P的视频

ffmpeg -i test.flv -threads 1 -vf scale=1920:1080 -f mp4 test.mp4 -y

其中