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

目录

  • 前言
    • 内容简介
    • 为什么会有这篇文章
  • 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、外网技术论坛、博客,也全是零零碎碎的,一直在改命令行参数,又是折腾了一天(本地测试的时候就已经用了两三天)。
最后这个需求直接从周一做到了周六早上才完成在服务器上的测试。
总结:搜索的文章太零散、并且有效的不多。所以这里写一个总结,也给自己当一下笔记。

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权限进行安装或者编译的。

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.mzph.cn/diannao/3462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp H5实现签名

第一种&#xff1a;跳转签名页面 1、创建审核页面audit.vue <template><view><uni-section title""><view class"auditClass"><uni-forms :model"baseFormData" ref"baseFormRef" :rules"rules&quo…

【Flink入门修炼】2-3 Flink Checkpoint 原理机制

如果让你来做一个有状态流式应用的故障恢复&#xff0c;你会如何来做呢&#xff1f; 单机和多机会遇到什么不同的问题&#xff1f; Flink Checkpoint 是做什么用的&#xff1f;原理是什么&#xff1f; 一、什么是 Checkpoint&#xff1f; Checkpoint 是对当前运行状态的完整记…

elementui el-date-picker禁止选择今年、今天、之前、时间范围限制18个月

1、禁止选择今年之前的所有年份 <el-date-pickerv-if"tabsActive 0":clearable"false"v-model"yearValue"change"yearTimeChange"type"year"placeholder"选择年"value-format"yyyy":picker-options…

03 OLED显示屏实现

文章目录 前言一、软件模拟IIC协议1.开启IIC协议2.结束IIC协议3.传输数据 二、OLED的操作1.传输数据的准备2.写入命令3.写入数据4.初始化函数5.设置光标6.显示字符7.显示字符串8.清屏9.显示汉字10.显示图片11.显示动图 三、完整代码总结 前言 这一章主要是上一节没有讲完的项目…

前端项目中使用插件prettier/jscodeshift/json-stringify-pretty-compact格式化代码或json数据

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、json代码格式化-选型二、json-stringify-pretty-compact简单试用三、prettier在前端使用四、查看prettier支持的语言和插件五、使用prettier格式化vue代码最终效果如图&#xff1a; ![在这里插入图片描述](https://im…

LLM应用实战:当KBQA集成LLM(二)

1. 背景 又两周过去了&#xff0c;本qiang~依然奋斗在上周提到的项目KBQA集成LLM&#xff0c;感兴趣的可通过传送门查阅先前的文章《LLM应用实战&#xff1a;当KBQA集成LLM》。 本次又有什么更新呢&#xff1f;主要是针对上次提到的缺点进行优化改进。主要包含如下方面&#…

多客圈子交友系统 uniapp+thinkphp6适配小程序/H5/app/api全开源,多款插件自选,支持个性定制!

网上交友的优点包括&#xff1a; 1. 方便&#xff1a;网上交友可以随时随地进行&#xff0c;不受时间和空间的限制&#xff0c;方便且高效。 2. 匿名性&#xff1a;网上交友可以实现匿名性&#xff0c;用户可以匿名地搜索、聊天或交换信息&#xff0c;保护个人隐私和安全。 3.…

COOIS 生产订单显示系统增强

需求说明&#xff1a;订单系统显示页面新增批量打印功能 增强点&#xff1a;CL_COIS_DISP_LIST_NAVIGATION -->TOOLBAR方法中新增隐式增强添加自定义打印按钮 增强点&#xff1a;BADI-->WORKORDER_INFOSYSTEM新增增强实施 实现位置&#xff1a;IF_EX_WORKORDER_INFOSYS…

制造型企业 如何实现便捷的机台文件统一管理?

机台文件统一管理&#xff0c;这是生产制造型企业都需要去做的&#xff0c;机台文件需要统一管理的原因主要包括以下几点&#xff1a; 1、提高效率&#xff1a;统一管理可以简化文件的访问和使用过程&#xff0c;提高工作效率&#xff0c;尤其是在需要频繁访问或更新机台文件的…

MySQL中什么情况下会出现索引失效?如何排查索引失效?

目录 1-引言&#xff1a;什么是MySQL的索引失效&#xff1f;(What、Why)1-1 索引失效定义1-2 为什么排查索引失效 2- 索引失效的原因及排查&#xff08;How&#xff09;2-1 索引失效的情况① 索引列参与计算② 对索引列进行函数操作③ 查询中使用了 OR 两边有范围查询 > 或 …

USB设备的音频类UAC

一、UAC简介 UAC&#xff08;USB Audio Class&#xff09;是USB设备的音频类&#xff0c;它定义了USB音频设备与主机计算机通信的方式。UAC标准是USB规范的一部分&#xff0c;并受到各种操作系统&#xff08;包括Windows、macOS和Linux&#xff09;的支持。 UAC是基于libusb,实…

图像在神经网络中的预处理与后处理的原理和作用(最详细版本)

1. 问题引出及内容介绍 相信大家在学习与图像任务相关的神经网络时&#xff0c;经常会见到这样一个预处理方式。 self.to_tensor_norm transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) 具体原理及作用稍后解释&…

java8 Stream流常用方法(持续更新中...)

java8 Stream流常用方法 1.过滤数据中年龄大于等于十八的学生2.获取对象中其中的一个字段并添加到集合(以学生姓名&#xff08;name&#xff09;为例)3.获取对象中其中的一个字段并转为其他数据类型最后添加到集合(以学生性别&#xff08;sex&#xff09;为例&#xff0c;将Str…

Apache Doris 2.x 版本【保姆级】安装+使用教程

Doris简介 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。基于…

【论文速读】|大语言模型(LLM)智能体可以自主利用1-day漏洞

本次分享论文&#xff1a; LLM Agents can Autonomously Exploit One-day Vulnerabilities 基本信息 原文作者&#xff1a;Richard Fang, Rohan Bindu, Akul Gupta, Daniel Kang 作者单位&#xff1a;无详细信息提供 关键词&#xff1a;大语言模型, 网络安全, 1-day漏洞, …

Redisson分布式锁 --- 源码分析

1.获取一把锁 RLock lock redissonClient.getLock("订单lock"); 2.业务代码加锁 lock.lock(); 2.1 lock.tryAcquire Long ttl tryAcquire(leaseTime, unit, threadId); 2.2 lua脚本: tryLockInnerAsync方法 如果获取锁失败&#xff0c;返回的结果是这个key的剩…

MMSeg搭建模型的坑

Input type(torch.suda.FloatTensor) and weight type (torch.FloatTensor) should be same 自己搭建模型的时候&#xff0c;经常会遇到二者不匹配&#xff0c;以这种情况为例&#xff0c;是因为部分模型没有加载到CUDA上面造成的。 注意搭建模型的时候&#xff0c;所有层都应…

【氮化镓】液态Ga在GaN(0001)和(0001̅)表面上的三维有序排列随温度的变化

文章标题是《Temperature dependence of liquid-gallium ordering on the surface of epitaxially grown GaN》&#xff0c;作者是Takuo Sasaki等人&#xff0c;发表在《Applied Physics Express》上。文章主要研究了在分子束外延(MBE)条件下&#xff0c;液态镓(Ga)在GaN(0001)…

WCH RISC CH32V303RCT6 单片机的SDI Printf 虚拟串口功能 类似RTT打印功能 简单分析

参考&#xff1a; 有关于 SDI printf 更多的信息和资料吗&#xff1f; 关于 CH32 系列 MCU SDI 虚拟串口功能的使用 【CH32X035 评估板测评】 教你使用 SDI 接口重定向 printf 0.前言 有段时间没有看CH32V单片机的开发了&#xff0c;今天帮新来的同事调试时候看到debug.c里面有…

java-spring 06 图灵 getBean方法和 doGetBean方法

01.一般的流程是&#xff0c;这里是从上一章的preInstantiateSingleton方法顺序过来的。 getBean() -> doGetBean() -> createBean() -> doCreateBean() -> createBeanInstance() -> populateBean() -> initializeBean() 02.getBean方法&#xff0c;一般就…