前言
FFmpeg 是一个开放源代码的自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。“FFmpeg”这个单词中的“FF”指的是“Fast Forward(快速前进)”。
FFmpeg基础组件:
(1)命令行应用程序
- ffmpeg:用于对视频或音频进行处理
- ffplay:一个简单的播放器,基于SDL与FFmpeg库
- ffprobe:用于显示媒体文件的信息
(2)函数库
- libavutil:包含一些工具库
- libavcodec:包含全部FFmpeg音频/视频编解码库
- libavformat:包含demuxers和muxer库
- libavdevice
- libavfilter
- libavresample
- libswresample
- libpostproc:对于视频做前处理的库
- libswscale:对于影像作缩放的库
安装
基础版安装
无需CUDA加速的基础版本安装可以查阅:
Ubuntu上安装ffmpeg
CUDA支持版安装
(0)提前安装并配置好CUDA环境
-------软硬件信息--------------------
操作系统:Ubuntu18.04
Nvidia 显卡:RTX 2080Ti
Nvidia 驱动版本:440.82
CUDA 版本: 10.1
Python 版本:3.6.10
-----------------------------------
(1)官网下载安装包:
(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
(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
检验和使用
检验
(1)列出gpu解码器:
ffmpeg -decoders | grep cuvid
(2)列出gpu编码器:
ffmpeg -encoders | grep nvenc
使用
(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))
参考资料
[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