1. 服务器上怎么使用ffmpeg(手动编译/使用编译好的)。
2. 非Root用户要怎么安装和使用(仅做引导)。
3. ffmpeg命令的一些使用引导和参数介绍。
4. 服务器怎么安装硬件加速GPU环境(Nvidia案例)。
5. 服务器显卡工具包命令介绍(NVIDIA-SMI)。
6. 怎么使用硬件加速,加水印案例(CUDA、GPU编解码、处理过滤器) 。
上周有个需求需要在服务器上需要使用ffmpeg给视频加水印、并且多线程,还要求速度不能太慢。
光是在服务器上折腾环境就浪费了一整天,搜索各种文章、都是零零碎碎,没有一篇是完整的,最后发现其实云服务商里就有完整的文章,直接裂开(并且没有服务器root权限,不敢尝试,如果有权限会很简单)。
然后环境装好了,ffmpeg跑起来了,结果发现GPU利用率10%不到,又开始在csdn、微信文章、谷歌、github、外网技术论坛、博客,也全是零零碎碎的,一直在改命令行参数,又是折腾了一天(本地测试的时候就已经用了两三天)。
最后这个需求直接从周一做到了周六早上才完成在服务器上的测试。
总结:搜索的文章太零散、并且有效的不多。所以这里写一个总结,也给自己当一下笔记。
官网:ffmpeg
github:FFmpeg-Builds
如果没有系统和版本需求选择 ffmpeg-master-latest-linux64-gpl.tar.xz 就行。
FFmpeg-Builds是在ffmpeg官网中获取的一个构建项目,也包含了windows、linuxarm64的版本
# 如果服务器下载太慢可以自己本地电脑翻墙下载,在上传到服务器,会快一点
cd ~
mkdir toolkits
cd toolkits
wget https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz
tar xvf ffmpeg-master-latest-linux64-gpl.tar.xz
# 这个目录下的 ffmpeg ffplay ffprobe 就是可执行文件
cd ffmpeg-master-latest-linux64-gpl/bin
# 能输出就说明已经可以使用了
./ffmpeg -version
# 添加进环境变量
vi ~/.bash_profile
# 末行添加
export PATH=$PATH:/home/konglong/toolkits/ffmpeg-master-latest-linux64-gpl/build/bin
source ~/.bash_profile
后面的版本号说明(其他介绍看FFmpeg-Builds的README.md文件):
gpl - 包括所有依赖项,即使是那些需要完整的GPL而不仅仅是LGPL的依赖项。
lgpl - 缺少仅支持gpl的库。最突出的是libx264和libx265。
nonfree - 除了gpl变体的所有依赖项外,还包括fdk-aac。
gpl-shared - 与gpl相同,但带有libav*家族的共享库,而不是纯静态可执行文件。
lgpl-shared - 与lgpl相同,但是使用lgpl的依赖项集。
nonfree-shared - 与nonfree相同,是依赖项的非自由集合
# 如果服务器下载太慢可以自己本地电脑翻墙下载,在上传到服务器,会快一点
cd ~
mkdir toolkits
cd toolkits
wget https://ffmpeg.org/releases/ffmpeg-6.1.1.tar.xz
tar xvf ffmpeg-6.1.1.tar.xz
cd ffmpeg-6.1.1
# 因为设置不同的编译参数需要安装不同的环境和一些编解码器,所以这里只做最小安装的案例。
# 具体参数怎么配置和需要安装什么环境建议去搜索其他文章或者看文档,或者cat ./configure 看里面的设置的参数作用进行配置
# 这是最小安装的参数,如果需要使用到其他的编码器之类的东西在 ./configure后面加-- 进行配置。
./configure --prefix=/home/konglong/toolkits/ffmpeg-6.1.1/build --disable-x86asm
make # 如果服务器允许建议使用 make -j8 这是开启8个进程进行加速编译,不然会非常慢
make install # 这是把编译好的ffmpeg移动到你配置好的--prefix,如果没配置会默认安装到configure中配置的prefix_default中
cd build/bin
./ffmpeg -version
# 添加到环境变量
vi ~/.bash_profile
# 末行添加
export PATH=$PATH:/home/konglong/toolkits/ffmpeg-6.1.1/build/bin
source ~/.bash_profile
原理:编译完成的ffmpeg和要使用到的一些编解码器、工具包指向的存放的目录一般都是需要root权限的,不管是使用还是访问,普通用户都没有权限。
所以:非root需要把所有需要用到的比如ffmpeg、编解码器、等工具环境自己进行编译,并且编译之前需要把所有的存放目录都指向当前用户的home目录下。
建议:非Root用户,不建议在非root上进行安装和编译。最好还是找服务器管理员,去把编译完成的ffmpeg放到服务器目录上,在给你开使用权限,不然会很麻烦。不仅仅是ffmpeg,包括后面如果需要使用硬件加速需要安装显卡驱动、cuda工具包、特定编解码器,这些都是需要root权限进行安装或者编译的。
ffmpeg -h
最上面这一坨东西只需要关注configuration: 这后面内容,这些是ffmpeg编译时的参数、包括你有没有启用某些编码器、支持哪些编解码都能在上面展示。
有时候我们不知道我们当前系统、版本的ffmpeg支持哪些编解码器过滤器记可以通过这几个命令去进行查询,找到关键词后在去具体的使用方式,或者看源码文档也能找到使用案例。
如果你使用的是云GPU服务器,并且没有使用官方的镜像也是需要安装的。
# 查看NVIDIA显卡型号
lspci | grep NVIDIA # 没有的话就是空
注意:安装GPU驱动和CUDA的时候要选择好对应的版本。
查到显卡型号后再去对应GPU驱动和支持的CUDA工具包
需要root权限
新版本的CUDA工具包好像包含了GPU驱动,如果服务器GPU毕竟新可以跳过这一步,直接使用安装CUDA同时安装GPU驱动,也可以手动安装GPU驱动在安装CUDA工具包
chmod +x
在直接输入文件名就可以运行了,然后安装提示说明进行安装。nvidia-smi
进行验证,如果不生效可以重启一下服务器试试。rpm(local)
,如果安装了驱动更可以用runfile(local)
然后在安装的时候取消安装GPU驱动。/usr/local/cuda/bin/nvcc -V
进行验证,如果不生效可以重启一下服务器试试。直接看其他人的文章把,已经总结的很好了
基础命令
ffmpeg -i "input.mp4" \
-i "watermark.png" \
-filter_complex "[1:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:-1:-1:color=black[wm];[0:v]format=yuv420p[main];[main][wm]overlay[outvideo]" \
-map "[outvideo]" \
-map 0:a "output.mp4" \
-y
GPU编解码
ffmpeg -c:v h264_cuvid -i "input.mp4" \
-i "watermark.png" \
-filter_complex "[1:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:-1:-1:color=black[wm];[0:v]format=yuv420p[main];[main][wm]overlay[outvideo]" \
-map "[outvideo]" \
-map 0:a -c:v h264_nvenc "output.mp4" \
-y
使用CUDA,并且处理过滤器
# 1、使用-hwaccel cuda -hwaccel_output_format cuda -i "input.mp4" 会使用cuda gpu加速解码,并且数据会放到gpu显存中
# 2、[1:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:-1:-1:color=black,hwupload_cuda[wm] 这里多了hwupload_cuda 是把前面处理的过滤滤镜上传到cuda gpu显存,变为cuda帧
# 3、对于[0:v]视频帧即使保持分辨率不变也需要将其转换为cuda帧,所以使用了scale_cuda,否则无法合成
# 4、然后使用overlay_cuda进行合成叠加
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i "input.mp4" \
-i "watermark.png" \
-filter_complex "[1:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:-1:-1:color=black,hwupload_cuda[wm];[0:v]scale_cuda=1080:1920:format=yuv420p[main];[main][wm]overlay_cuda[outvideo]" \
-map "[outvideo]" \
-map 0:a -c:v h264_nvenc "output.mp4" \
-y
如果文章内容有什么地方不对,欢迎评论或者私信提醒。
如果你有更多的案例也可以私信我添加到文章内容中。