• Linux(Centos)服务器探索ffmpeg笔记 (命令行、Nvidia硬件加速、GPU、CPU、CUDA、h264_nvenc、过滤器、加水印)


    前言

    内容简介

     1. 服务器上怎么使用ffmpeg(手动编译/使用编译好的)。
     2. 非Root用户要怎么安装和使用(仅做引导)。
     3. ffmpeg命令的一些使用引导和参数介绍。
     4. 服务器怎么安装硬件加速GPU环境(Nvidia案例)。
     5. 服务器显卡工具包命令介绍(NVIDIA-SMI)。
     6. 怎么使用硬件加速,加水印案例(CUDA、GPU编解码、处理过滤器)  。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    为什么会有这篇文章

    上周有个需求需要在服务器上需要使用ffmpeg给视频加水印、并且多线程,还要求速度不能太慢。
    光是在服务器上折腾环境就浪费了一整天,搜索各种文章、都是零零碎碎,没有一篇是完整的,最后发现其实云服务商里就有完整的文章,直接裂开(并且没有服务器root权限,不敢尝试,如果有权限会很简单)。

    然后环境装好了,ffmpeg跑起来了,结果发现GPU利用率10%不到,又开始在csdn、微信文章、谷歌、github、外网技术论坛、博客,也全是零零碎碎的,一直在改命令行参数,又是折腾了一天(本地测试的时候就已经用了两三天)。
    最后这个需求直接从周一做到了周六早上才完成在服务器上的测试。
    总结:搜索的文章太零散、并且有效的不多。所以这里写一个总结,也给自己当一下笔记。

    1、服务器上怎么使用ffmpeg

    官网:ffmpeg

    1.1 使用编译好的(需要root权限)

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    后面的版本号说明(其他介绍看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相同,是依赖项的非自由集合

    1.2 自己怎么编译(需要root权限)

    ffmpeg

    # 如果服务器下载太慢可以自己本地电脑翻墙下载,在上传到服务器,会快一点
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2 、非Root用户要怎么安装和使用

    原理:编译完成的ffmpeg和要使用到的一些编解码器、工具包指向的存放的目录一般都是需要root权限的,不管是使用还是访问,普通用户都没有权限。
    所以:非root需要把所有需要用到的比如ffmpeg、编解码器、等工具环境自己进行编译,并且编译之前需要把所有的存放目录都指向当前用户的home目录下。
    建议:非Root用户,不建议在非root上进行安装和编译。最好还是找服务器管理员,去把编译完成的ffmpeg放到服务器目录上,在给你开使用权限,不然会很麻烦。不仅仅是ffmpeg,包括后面如果需要使用硬件加速需要安装显卡驱动、cuda工具包、特定编解码器,这些都是需要root权限进行安装或者编译的。

    3、ffmpeg命令的一些使用引导和参数介绍

    3.1 编译参数

    ffmpeg -h
    
    • 1

    最上面这一坨东西只需要关注configuration: 这后面内容,这些是ffmpeg编译时的参数、包括你有没有启用某些编码器、支持哪些编解码都能在上面展示。
    在这里插入图片描述

    3.2 查询支持的编解码器过滤器

    有时候我们不知道我们当前系统、版本的ffmpeg支持哪些编解码器过滤器记可以通过这几个命令去进行查询,找到关键词后在去具体的使用方式,或者看源码文档也能找到使用案例。
    在这里插入图片描述

    3.3 官方wike文档

    Wike

    3.4 怎么搜索过滤器的使用案例和参数说明

    1. 官方wiki-Filtering 可以找到一些简单例子
    2. 官方开发文档 内容有限仅仅能够了解
    3. ⭐️【强烈推荐】下载源码,源码目录下的doc/filters.texi文件,可以清楚的看到每个过滤器的作用、支持的参数、参数名。(这东西可能是在什么网站上挂着的,但是没有找到,只能看源码了)

    3.5 怎么搜索硬件加速方面内容

    1. ⭐️【强烈推荐官方wiki-HWAccelIntro
    2. ⭐️【强烈推荐英伟达NVIDA社区

    4、服务器怎么安装硬件加速GPU环境(Nvidia案例)

    如果你使用的是云GPU服务器,并且没有使用官方的镜像也是需要安装的。

    # 查看NVIDIA显卡型号
    lspci | grep NVIDIA # 没有的话就是空
    
    • 1
    • 2

    注意:安装GPU驱动和CUDA的时候要选择好对应的版本。
    查到显卡型号后再去对应GPU驱动和支持的CUDA工具包

    4.1 推荐文档文章

    1. nvidia驱动文档
    2. cuda文档
    3. GPU服务器环境安装文档(抖音火山引擎)
    4. GPU服务器环境安装文档(腾讯云)
    5. FFmpeg在 Windows 环境编译(64位)支持h264,h265,和Intel QSV,Nvidia Cuda,AMD amf 硬件加速(CSDN)

    4.2 需要安装GPU驱动

    需要root权限
    新版本的CUDA工具包好像包含了GPU驱动,如果服务器GPU毕竟新可以跳过这一步,直接使用安装CUDA同时安装GPU驱动,也可以手动安装GPU驱动在安装CUDA工具包

    1. 驱动搜索页面NVIDIA 驱动程序下载 ,搜索对应自己系统和GPU型号的驱动进行下载
    2. 下载完成后应该是一个.run 文件,在服务器中 赋予可执行权限 chmod +x 在直接输入文件名就可以运行了,然后安装提示说明进行安装。
    3. 安装完成后使用 nvidia-smi 进行验证,如果不生效可以重启一下服务器试试。
      在这里插入图片描述

    4.3 安装CUDA工具包(硬件加速支持的接口)

    1. 选择对应版本的CUDA进行下载,整个包有4~5G大小,所以最好是本地下载,然后上传到服务器不然非常慢。
    2. 如果没有安装GPU驱动,可以直接使用rpm(local),如果安装了驱动更可以用runfile(local) 然后在安装的时候取消安装GPU驱动。
    3. 安装完成后使用/usr/local/cuda/bin/nvcc -V进行验证,如果不生效可以重启一下服务器试试。
      在这里插入图片描述

    5、服务器显卡工具包命令介绍(NVIDIA-SMI)。

    直接看其他人的文章把,已经总结的很好了

    推荐文章

    1. 通过 NVIDIA-SMI 统计GPU使用情况
    2. nvidia-smi命令详解和一些高阶技巧介绍
    3. nvidia-smi简介及各参数的详解与字段的详解和使用
    4. 查看GPU使用的最佳方式

    怎么使用硬件加速,加水印案例(CUDA、GPU编解码、处理过滤器)

    基础命令

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结束

    如果文章内容有什么地方不对,欢迎评论或者私信提醒。

    如果你有更多的案例也可以私信我添加到文章内容中。

  • 相关阅读:
    Ollama 源代码中值得阅读的部分
    Git学习使用笔记--(一)
    六个讨厌 Tailwind CSS 的理由
    如何在.net6webapi中记录每次接口请求的日志
    【深度学习】AI换脸,EasyPhoto: Your Personal AI Photo Generator【一】
    MyBaties存储和查询json格式的数据(实体存储查询版本)
    什么是PROFIBUS DP网络布线的1米原则?分支线又是什么?
    【ESP32】ESP-Face 人脸检测识别
    【24种设计模式】观察者模式(Observer Pattern)
    分布式缓存
  • 原文地址:https://blog.csdn.net/xyl192960/article/details/138005698