使用ffmpeg支持Intel核显的硬件编解码
ffmpeg本身已支持对各类显卡的使用,显卡的驱动也已在Debian11安装时被安装完毕,在Debian11上使用Intel的核显功能仅需使用ffmpeg的指定参数
安装ffmpeg
- 可以直接使用apt-get命令安装ffmpeg
apt-get install ffmpeg
识别是否支持GPU(仅Intel)
- Debian系统一般内置对Intel集显GPU的驱动支持,具体可看Debian官方说明
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 版。
获取视频信息
- 以一个名为test.flv的源视频为例,获取视频信息
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后含有编码、分辨率等信息
获取更详细的视频信息
- 以一个名为test.flv的源视频为例,获取视频信息
ffprobe -v error -show_streams -print_format json test.flv
- ffprobe返回字段说明
字段 | 说明 |
---|---|
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
其中
- select=gt(scene,0.5)内的0.5表示某帧画面与前一帧的差异,数字越大,差异越多,此参数可用来保证在多个视频以纯色开始时,获取到产生变化的那一帧,使视频截图更具有代表性,但是生成时间会变长,因为程序会顺序检查每帧,遇到帧变化达到指定值的才完成;如果需要快速获取截图,可以在删去-vf选项后使用-t 0.001,表示直接截取0.001秒的那一帧
- -s 352x240表示需要生成的截图大小
- -frames:v 1表示只取一帧作为截图,此参数不变
- test.jpg为生成的文件名,test.png也支持,实测jpg比png小,最好使用jpg
生成视频截图
在不能使用硬件加速的情况下,可以使用软件(即CPU)来截图,以一个名为test.flv的源视频为例,获取视频截图,这是一个耗时操作,建议采用队列处理多个视频同时生成截图
ffmpeg -i test.flv -threads 1 -vf "select=gt(scene\,0.3)" -s 352x240 -frames:v 1 test.jpg -y
其中
- -threads 1表示使用1个线程
视频转码(硬件加速)
以一个名为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
其中
- -vf scale_qsv=1920:1080是目标分辨率,如果分辨率没变,不要带上此参数
- -c:v h264_qsv是使用的解码器,此处需要根据源视频的编码使用不支持的值,源视频的编码通过ffprobe取得,属性值为codec_name。ffmpeg支持以下编码,说明中的codec与codec_name对应:
解码器名称 | 说明 |
---|---|
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对编解码器的支持有多有少,因此就算使用了正确的解码器进行解码,也可能因为硬件不支持失败,此时可以不使用硬件加速
- -vcodec h264_qsv指定编码器,不用改
- -vf scale_qsv=1920:1080指定转码的视频分辨率,可以根据需要改,如果分辨率不变,不要带上此参数
视频转码
在不能使用硬件加速的情况下,可以使用软件(即CPU)来转码,以一个名为test.flv的源视频为例,转换成1080P的视频
ffmpeg -i test.flv -threads 1 -vf scale=1920:1080 -f mp4 test.mp4 -y
其中
- -vf scale_qsv=1920:1080是目标分辨率,如果分辨率不变,不要带上此参数
- -threads 1表示使用1个线程