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

embedded/2024/9/25 10:33:19/

目录

  • 前言
    • 内容简介
    • 为什么会有这篇文章
  • 1、服务器上怎么使用ffmpeg
    • 1.1 使用编译好的(需要root权限)
    • 1.2 自己怎么编译(需要root权限)
  • 2 、非Root用户要怎么安装和使用
  • 3、ffmpeg命令的一些使用引导和参数介绍
    • 3.1 编译参数
    • 3.2 查询支持的编解码器过滤器
    • 3.3 官方wike文档
    • 3.4 怎么搜索过滤器的使用案例和参数说明
    • 3.5 怎么搜索硬件加速方面内容
  • 4、服务器怎么安装硬件加速GPU环境(Nvidia案例)
    • 4.1 推荐文档文章
    • 4.2 需要安装GPU驱动
    • 4.3 安装CUDA工具包(硬件加速支持的接口)
  • 5、服务器显卡工具包命令介绍(NVIDIA-SMI)。
    • 推荐文章
  • 怎么使用硬件加速,加水印案例(CUDA、GPU编解码、处理过滤器)
  • 结束

前言

内容简介

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

为什么会有这篇文章

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

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

ffmpeg_22">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

后面的版本号说明(其他介绍看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.xzcd 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

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

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

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

3.1 编译参数

ffmpeg -h

最上面这一坨东西只需要关注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 # 没有的话就是空

注意:安装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

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

结束

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

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


http://www.ppmy.cn/embedded/16495.html

相关文章

使用git将本地项目上传到github

大致的流程是:创建本地仓库,把代码传到本地仓库,把本地仓库内容传到远程仓库。还不太完整,逐渐摸索使用吧 1、初始化仓库 git init在本地项目的路径中初始化一个仓库。 2、提交到本地 选择需要上传的文件 git add .提交到本地…

Github学生认证

Github学生认证 文章目录 前言一、前期准备1.1. 添加学校邮箱1.2. 开通2FA双重身份验证1.3. 在线验证报告1.4. 完善基础信息 二、Github学生认证总结 前言 为了免费使用GitHub Copilot,故在github中申请学生认证。 一、前期准备 1.1. 添加学校邮箱 申请完学校邮箱…

提示工程 1—常用的大语言模型参数说明

1. 常用的大语言模型参数说明 使用提示词时,会通过 API 或直接与大语言模型进行交互。我们可以通过配置一些参数以获得不同的提示结果。调整这些设置对于提高响应的可靠性非常重要,我们可能需要进行一些实验才能找出适合您的用例的正确设置。以下是一些常见的参数设置: 1.…

专项技能训练五《云计算网络技术与应用》实训6-1:安装OpenDayLight控制器

文章目录 OpenDayLight环境安装及常用操作1. 使用VMware安装CentOS 7虚拟机,安装时需添加多一张网卡,该网卡为自定义-VMnet1.并且记得开启CPU虚拟化,将其命名为“OpenDayLight”。2. 安装完虚拟机后,进入虚拟机,修改网…

【年报文本分析】第二辑:python+selium实现根据股票代码和对应年份获取上市公司年报链接(巨潮资讯网)

目录 序言excel文件准备函数模块介绍创建模拟浏览器对象只需要执行一次的部分需要批量执行的重复操作部分(信息录入excel)主函数 本地文件结构全部代码结果预览 本文以指定的A股公司年报为例,从巨潮资讯网上获取。 该方法建议需要特定年报数据…

家庭环境如何异地组网装修?

家庭异地组网装修是如今越来越受到人们关注的问题。在现代社会中,家庭成员经常因为各种原因而分散在不同的地区。这种情况下,如何实现家庭网络的高效通信变得尤为重要。本文将介绍一款异地组网产品——【天联】组网,它能够帮助家庭解决异地组…

字符串漏洞注入深入学习

字符串型漏洞注入,特别是针对Web应用程序的SQL注入,是一种常见的网络安全威胁。它涉及攻击者在不受控制的情况下,通过构造特定的字符串输入,干扰或改变应用程序中原有的SQL查询语句,从而执行恶意的SQL代码。 要深入学…

李沐66_使用注意力机制的seq2seq——自学笔记

加入注意力 1.编码器对每次词的输出作为key和value 2.解码器RNN对上一个词的输出是query 3.注意力的输出和下一个词的词嵌入合并进入RNN 一个带有Bahdanau注意力的循环神经网络编码器-解码器模型 总结 1.seq2seq通过隐状态在编码器和解码器中传递信息 2.注意力机制可以根…