新知一下
海量新知
6 0 7 1 4 1 4

FFmpeg 使用显卡加速转码

字节流动 | 一个开发者的认知、技术与生活感 2022/01/14 14:22

前言

视频转码时如果遇见视频比较大、时长很长的时候,转码压制需要等待很久且及占用cpu ,所以就在想有没有什么办法可以加速转码进度呢 ,故本篇文章记录FFMPEG如何调用显卡对转换编码格式或者压制进行加速。

软硬编解码的区分:

软编码:使用CPU进行编码

硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等

软硬编解码的区别:

软编码:实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。

硬编码:性能高,低码率下通常质量低于软编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。

简单来说硬解码就是 内存 - codec 电路 - 内存/显示 的过程所以速度会比软件编解码快

基础环境

  • FFMPEG BUILDS 4.4.1

    FFmpeg Builds https://www.gyan.dev/ffmpeg/builds/

  • GeForce GTX 1060(NVIDIA)

    显卡支持列表

  • windows 10

环境搭建

安装FFMPEG

https://ffmpeg.org/download.html

根据系统选择适合的版本进行下载

新知达人, FFmpeg 使用显卡加速转码

选择版本进行下载,本人下载的是

ffmpeg-release-essentials.zip

新知达人, FFmpeg 使用显卡加速转码

环境配置

压缩

ffmpeg-release-essentials.zip

到指定目录,进入

bin

目录,里面有三个文件

ffmpeg.exe ffplay.exe ffprobe.exe

其中我们经常使用到的就是

ffmpeg.exe

,此时在目录中可以执行

ffmpeg version

PS D:Softwareffmpegbin> ffmpeg -version

ffmpeg version 2021-05-05-git-7c451b609c-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers

built with gcc 10.2.0 (Rev6, Built by MSYS2 project)

configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint

libavutil 57. 0.100 / 57. 0.100

libavcodec 59. 0.100 / 59. 0.100

libavformat 59. 0.101 / 59. 0.101

libavdevice 59. 0.100 / 59. 0.100

libavfilter 8. 0.101 / 8. 0.101

libswscale 6. 0.100 / 6. 0.100

libswresample 4. 0.100 / 4. 0.100

libpostproc 56. 0.100 / 56. 0.100

出现以上信息证明安装成功,如果不想每次都进入目录或使用绝对路径,可以配置环境变量。

新知达人, FFmpeg 使用显卡加速转码

安装 CUDA 驱动

CUDA是一个驱动程序,可以让GPU进行相关运算,因为我们开发应用程序一般不直接操控GPU,而是通过驱动来操作。

首先确定自己的电脑是否支持CUDA

Video Encode and Decode GPU Support Matrix

下载 https://developer.nvidia.com/cuda-downloads

选择系统类型下载

新知达人, FFmpeg 使用显卡加速转码

硬件加速方式

通过命令

ffmpeg -hwaccels

可以查询系统支持的硬件加速器。

ffmpeg -hwaccels

----------------------------------------------

cuda

dxva2

qsv

d3d11va

opencl

vulkan

PS:以上输出代表系统所支持的硬件加速方式,后续会用到

硬编码后缀解释

  • qsv

    :intel显卡的快速视频同步技术(quick sync video)

  • nvenc

    :nvidia显卡的硬件视频编码器(nvidia hardware video encoder)

  • cuvid

    :nvdec的旧称,只有解码端。

  • cuda

    :同上

  • amf

    :amd显卡的amf硬件编码器(amd hardware encoder)

基本上所有的Intel 电脑都支持qsv方式。

编解码器支持

ffmpeg -codecs

查询编码器

ffmpeg -codecs

后面可以跟

sls

命令查询所需的编码,例如:

ffmpeg -codecs | sls nvenc

ffmpeg -codecs | sls nvenc

---------------------------------------------------------------

DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_qsv h264_cuvid ) (encoders:

libx264 libx264 libx264rgb h264_amf h264_nvenc h264_qsv )

DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_cuvid ) (encoder

s: libx265 hevc_amf hevc_nvenc hevc_qsv )

查询系统支持的编解码格式,需要用到

ffmpeg -decoders

ffmpeg -encoders

两个命令。

查询编解码器选项

查询编码器

hevc_nvenc

的选项

ffmpeg -h encoder=hevc_nvenc

查询解码器

h264_qsv

的详细信息

ffmpeg -h decoder=h264_qsv

ffmpeg -decoders

下面以h264作为测试

ffmpeg -decoders | sls h264

------------------------------------------------------

VFS..D h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10

V....D h264_qsv H264 video (Intel Quick Sync Video acceleration) (codec h264)

V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)

PS:

h264_qsv

h264_cuvid

h264

:就是支持的解码方式

sls

:作用相当于linux中的grep

h264_qsv

:英特尔硬解码

h264_cuvid

:英伟达硬解码

ffmpeg -encoders

同解码格式查询

ffmpeg -encoders | sls h264

--------------------------------------------------------

V..... libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)

V..... libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)

V..... libx264rgb libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264)

V....D h264_amf AMD AMF H.264 Encoder (codec h264)

V....D h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)

V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h26)

sls

:作用相当于linux中的grep

如以上有类似输出则证明是支持硬解码或者硬编码的。

硬件加速命令

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 2048k -s 1920x1080 output.mp4

常用命令参数解释

  • -hwaccel cuvid

    :使用

    cuvid

    进行硬件加速

  • -c:v h264_cuvid

    :使用

    h264_cuvid

    进行解码

  • -c:v h264_nvenc

    :使用

    h264_nvenc

    进行编码(nvidia硬件加速x265)

  • -b:v 2000k

    :比特率,值越大约清晰。

  • -s 1920x1080

    :分辨率

  • -b:v 3500K

    :视频平均比特率为 3500K

  • -bufsize 6000K

    :缓存区大小 6000K,建议设定为 当前码率 帧率 5,也许这里的2pass是针对缓冲区的,缓存未来5s

  • -maxrate 5000K

    :最大码率为 5000K,每帧的最高码率不超过这个数值

  • -preset slow

    :预设方案是 slow,slow已经是最好的选项了

  • -pix_fmt p010le

    :输出的像素格式是 p010le 也就10bit,只有新的硬件支持,例如:970m不支持,1070可以支持

总结

以上就是本人使用ffmpeg硬件加速转码的整体过程,如有疑问或者意见欢迎大家讨论。


更多“FFmpeg”相关内容

更多“FFmpeg”相关内容

新知精选

更多新知精选