前言

FFmpeg 是一个开放源代码的自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。“FFmpeg”这个单词中的“FF”指的是“Fast Forward(快速前进)”。

ffmpeg GPU加速 windows 慢 ffmpeg使用amd显卡加速_音视频

FFmpeg基础组件:
(1)命令行应用程序

  • ffmpeg:用于对视频或音频进行处理
  • ffplay:一个简单的播放器,基于SDL与FFmpeg库
  • ffprobe:用于显示媒体文件的信息

(2)函数库

  • libavutil:包含一些工具库
  • libavcodec:包含全部FFmpeg音频/视频编解码库
  • libavformat:包含demuxers和muxer库
  • libavdevice
  • libavfilter
  • libavresample
  • libswresample
  • libpostproc:对于视频做前处理的库
  • libswscale:对于影像作缩放的库

ffmpeg GPU加速 windows 慢 ffmpeg使用amd显卡加速_linux_02

安装

基础版安装

无需CUDA加速的基础版本安装可以查阅:
Ubuntu上安装ffmpeg

CUDA支持版安装

(0)提前安装并配置好CUDA环境

-------软硬件信息--------------------
操作系统:Ubuntu18.04
Nvidia 显卡:RTX 2080Ti
Nvidia 驱动版本:440.82
CUDA 版本: 10.1
Python 版本:3.6.10
-----------------------------------

(1)官网下载安装包:

ffmpeg GPU加速 windows 慢 ffmpeg使用amd显卡加速_ffmpeg_03


(2)解压

tar -xvf ffmpeg_4.2.2.orig.tar.xz

(3)安装yasm

sudo apt  install -y yasm

(4)设置编译项
添加cuda和cuvid使能:

./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc  --enable-gpl --enable-libx264 --enable-cuda --enable-cuvid

(5)下载并编译安装 FFmpeg NVIDIA headers (“ffnvcodec”)

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
(# 有多个分支,根据GPU驱动版本可能需要切换分支,本文采用git checkout sdk/9.1)
make
sudo make install

ffmpeg GPU加速 windows 慢 ffmpeg使用amd显卡加速_linux_04

(6)编译、安装FFmpeg

make
sudo make install

(7)建立软链接

sudo ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg
sudo ln -s /usr/local/ffmpeg/bin/ffprobe /usr/bin/ffprobe

(8)配置ffmpeg依赖环境

sudo vi /etc/ld.so.conf
在其中添加路径:/usr/local/ffmpeg/lib

sudo ldconfig#更新环境变量

(9)版本查看

ffmpeg

ffmpeg GPU加速 windows 慢 ffmpeg使用amd显卡加速_音视频_05

检验和使用

检验

(1)列出gpu解码器:

ffmpeg -decoders | grep cuvid

ffmpeg GPU加速 windows 慢 ffmpeg使用amd显卡加速_gpu_06


(2)列出gpu编码器:

ffmpeg -encoders | grep nvenc

ffmpeg GPU加速 windows 慢 ffmpeg使用amd显卡加速_ffmpeg_07

使用

(1)全CPU转码h264视频(CPU解码器libx264)到h264(CPU编码器libx264)

ffmpeg -i test.mp4 -c:v libx264 -y test-cpu.mp4

全CPU转码整体速度如下:

frame= 1056 fps= 21 q=-1.0 Lsize=    5509kB time=00:00:42.14 bitrate=1070.8kbits/s dup=2 drop=0 speed=0.84x

流映射关系:

Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))

可以看到用全CPU转码,FPS在20左右。

(2)全GPU转码h264视频(GPU解码器h264_cuvid)到h264(GPU编码器h264_nvenc)

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i test.mp4 -c:v h264_nvenc  -y test-gpu.mp4

全GPU转码整体速度如下:

frame= 1061 fps=847 q=18.0 Lsize=   10870kB time=00:00:42.40 bitrate=2100.1kbits/s dup=7 drop=0 speed=33.9x

流映射关系:

Stream mapping:
  Stream #0:0 -> #0:0 (h264 (h264_cuvid) -> h264 (h264_nvenc))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))

可以看到用CPU转码,FPS在850左右。
确实速度比CPU快太多,可能在帧数统计上会有些许差异。

(3)全GPU转码mpeg4(如mp4v)视频(GPU解码器mpeg4_cuvid)到h264(GPU编码器h264_nvenc)

ffmpeg -hwaccel cuvid -c:v mpeg4_cuvid -i test-mp4v.mp4 -c:v h264_nvenc  -y test-mp4v-gpu.mp4

(4)CPU解码GPU编码方式转码

ffmpeg -i test.mp4 -c:v h264_nvenc  -y test-gpu.mp4

转码整体速度如下:

frame= 1056 fps=628 q=18.0 Lsize=   10869kB time=00:00:42.20 bitrate=2110.0kbits/s dup=2 drop=0 speed=25.1x

流映射关系:

Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_nvenc))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))

ffmpeg GPU加速 windows 慢 ffmpeg使用amd显卡加速_音视频_08

参考资料

[1] Ubuntu上安装ffmpeg [2] FFmpeg官网 [3] Ubuntu下x264库编译安装 [4] 使用GPU硬件加速FFmpeg视频转码 [5] NVIDIA VIDEO CODEC SDK - Get Started [6] Github FFmpeg/nv-codec-headers [7] ERROR: cuvid requested, but not all dependencies are satisfied: cuda/ffnvcodec [8] Using GPU hardware to speed up FFmpeg video transcoding and pit draining [9] Ubuntu 16.04下编译ffmpeg支持CUDA下的cuvid vnenc和NPP [10] Use FFmpeg to Decode H.264 Stream with NVIDIA GPU Acceleration [11] NVIDIA FFmpeg Transcoding Guide [12] H.264 Video Encoding Guide [13] FFmpeg 维基百科 [14] FFmpeg nvenc issue: Driver does not support the required nvenc API version. Required: 9.1 Found: 9.0 - Video Technologies / Video Codec and Optical Flow SDK - NVIDIA Developer Forums [15] FFmpeg | NVIDIA Developer