Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速
本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示,你自己编译或者其他源的版本可能会不同。
ffmpeg 的一些介绍,以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装(不需要编译安装或者brew)、使用ffmpeg转码的教程,以及如何使用硬件加速 - ZhongUncle’s CSDN》。
如果你了解转码的流程,那么直接跳过前两节,通过侧边栏跳转到“使用FFMPEG硬件加速转码”部分直接看命令。
转码的流程(解码、编码、转码的区别)
任何转码都分为解码、编码这样一个步骤。简单来说,解码就是把视频文件转换成显示的视频,编码就是把视频转换成视频文件。
关于解码和编码举 2 个例子:
- 相机:相机就是通过把传感器的信号转换成某种视频格式,也就是编码,这样推流也好,存储也好,都好处理一些,毕竟与特特定传感器的信号格式无关了。
- 看视频:看视频就是把传输来的视频格式解码成特定信号,传给显示器等设备,让你看到。
ffmpeg 如果没有任何特殊选项,默认是使用软件解码、编码。硬件加速解码就是利用某种专为某些格式解码、编码设计的芯片进行操作。
一个常识:特定设计的芯片要比 CPU 通用处理器快很多,功耗也小很多。
软、硬解码编码的区别
软件解码、编码就是利用 CPU 运行一个软件,然后由这个软件进行解码、编码的操作。这样的好处就是如果一个格式更新了,或者一些特殊类型的编码都可以实现。而硬件编码在制造芯片的时候就已经写死了,无法更改了,所以基本上更新一代,就多支持几个格式。比如 980 Ti 的编码器只支持 4:2:0 的 4K H.265 的格式,如下:
但是到 1080 Ti 的时候,就多支持了三种:
需要注意,虽然视频编解码器一般都是和 GPU 同时出现,但是这玩意不是用 CUDA 等光栅单元实现的,是单独的一部分。比如 Tesla A100 这种特别强的 GPU 并不支持硬件编解码加速,因为没有硬件编解码器。(也不是所有计算卡的都没有,比如 V100、P100 都有)
此外,这玩意是有数量的,不是说支持硬件加速,你上 10 条视频一起处理和单独处理 1 条的速度一样,后面会演示这个现象。
使用FFMPEG硬件加速转码
简单的开始
好了,在了解基础信息之后,可以开始转码了。下面是最简单的命令:
ffmpeg -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc output.mp4
其中:
- 前面的
-c:v h264_cuvid
是用来解码的。如果你用过 Mac 上的硬件加速,会发现这种不太一样,它强制说明了解码器(如果不用这个会怎样呢,后面演示给你看)。 - 后面的
-c:v h264_nvenc
是用来编码的。
此外,如果你看过官方文档,会发现和官方文档的使用方法不一样,如果使用官方文档中的命令,很容易转码的时候出现问题。
设置码率和帧率
如果使用上述的命令进行转码,那么码率和帧数很可能会不同(比如帧率 30 变 25,码率 6m 变 2m),所以我们要制定码率和帧数:
ffmpeg -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 6000k -r 30 output.mp4
其中:
-b:v 6000k
表示码率是6000k
。-r 30
表示转码后的帧率为30
帧。
此时转码速率为 16x,要比核显快很多。此时显卡情况如下:
不指定硬件解码器会怎样?
前面提到它强制说明了解码器,那么如果不用这个会怎样呢?
如果不使用硬件解码器,那么就需要使用 CPU 进行软解,所以 CPU 使用率会很高,但是转码速度并不会有太大区别(有些时候会快一些):
这种方式也有自己的使用场景:当你要修复一个视频的编码器的时候,最好用软解码,因为硬件解码器很可能无法正确识别已经有问题的编码。比如我有一个视频,用有的播放器看的时候,会无法看 11 分钟之后的内容,那么如果使用硬件解码器,会出现下面的问题:
[h264_cuvid @ 0x55ed4090d540] cuvid decode callback error
Error while decoding stream #0:0: Generic error in an external library
打开视频发现转码的是黑屏,但是不指定解码器就可以正确转码。
在只有一个编码器上进行多个作业会怎样?
前面提到编码器、解码器是有数量的。并不是多少个都一样快,比如上面我们发现 3060 转码是 16x,如果同时进行两个转码任务,那么会发现总和差不多也是 16x。
这个结果可能会让你很沮丧,但是你想哈,比如直播和录像的时候,你实际上只需要 1x 的速度啊,这样的话相当于你可以同时至多跑 16 个流(实际上会少一些,因为并不是每个任务都是恒定 1x 的,保险起见要留余量),这就很不错了。
编码质量
FFMPEG
转码除了修复编码问题,一般都是换编码格式(比如 h265 转 h264)和文件格式。
同编码同文件文件格式的转码较少,不过我也试了,质量非常不错,和软转没啥区别。
我之前写过一篇 macOS 上 ffmpeg 硬件加速转码的博客:《macOS上如何安装(不需要编译安装或者brew)、使用ffmpeg转码的教程,以及如何使用硬件加速 - ZhongUncle’s CSDN》,里面有个对比,是 mp4 转 mov 的同时,降低码率从 42m 到 10m,对比如下:
CUDA 硬件转码的情况如下:
会发现 3060 的质量要比 8 代酷睿的 QSV 质量好一些,真不错,就是功耗大。
OBS
硬件编码器是有个支持码率范围的,超过和过低都会有较大的画质损耗或者编码问题。
英伟达官方建议 OBS 直播设置的的分辨率、码率、帧数设置如下(下图是机翻的,“1440点”是“1440P”,也就是 2k):
在游玩燕云十六声的时候,使用 OBS 录屏(nvenc h264 编码)8000k码率的和软编码画质差不多。采用 40Mbps 编码的时候,要比软编码差一点,但差的不是很多。关于这部分我会单独开一篇博客,之前用的是 MX250 这种英伟达 GPU,编码速度和质量要比 QSV 差很多。这里简单列一下截图:
我这里是按照个人习惯设置的,并没有按照 Nvidia 的建议设置,因为我一开始不知道官方推荐值。
麦田这种事物比较密集的场景很适合看码率损耗(你还可以用色彩多的画面检查,这个更明显),如下,可以看到麦穗虽然已经无法看清,但是远观并不糊(下面的图二次压缩过,但是也够看出来损耗可以接受了):
希望能帮到有需要的人~
参考资料/扩展阅读
NVIDIA FFmpeg Transcoding Guide - Nvidia Developer Technical Blog:ffmpeg 中 cuda 硬件转码的一些技术介绍。
Using FFmpeg with NVIDIA GPU Hardware Acceleration:ffmpeg 中 cuda 硬件编码、解码的技术文档。
Video Encode and Decode GPU Support Matrix - Nvidia Developer :这里你可以查看哪些 GPU 支持什么编、解码器。
NVIDIA NVENC OBS Guide - Nvidia:这里英伟达介绍了如何使用 OBS 直播。
Broadcasting 101: A Beginner’s Guide to Live Streaming:这里介绍了直播需要的设备规格和一些额外的链接。
相关文章:
Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速
本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示,你自己编译或者其他源的版本可能会不同。 ffmpeg 的一些介绍,以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装(不需要编译安装…...
磁盘满造成业务异常问题排查
最近遇到一个因为磁盘满导致的问题,分享一下,希望能够帮助到以后遇到同样问题的朋友。 早上突然收到业务老师反馈说:上传文件不能正常上传了。 想想之前都好好的,最近又没有更新,为什么突然不能使用了呢?…...
vim基本命令(vi、工作模式、普通模式、插入模式、可视模式、命令行模式、复制、粘贴、插入、删除、查找、替换)
1. Vim的作用 1.1. 文本编辑 1.1.1. 基础文本编辑功能 Vim是一个功能强大的文本编辑器,它可以用来创建、修改和保存各种文本文件。无论是编写简单的文本笔记,还是复杂的代码文件,Vim都能胜任。例如,我们可以用它来编写Python脚…...
vue的KeepAlive应用(针对全部页面及单一页面进行缓存)
KeepAlive的作用是缓存包裹在其中的动态切换组件 当一个组件在 中被切换时,它的 activated 和 deactivated 生命周期钩子将被调用,用来替代 mounted 和 unmounted。这适用于 的直接子节点及其所有子孙节点。 缓存全部页面 将app.vue中的路由出口改为&am…...
Big Model weekly | 第53期
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 01 CodeRosetta: Pushing the Boundaries of Unsupervised Code Translation for Parallel Programming 近期在大型语言模型(LLMs)的进展重新激发了自动编程语言翻译的兴趣。特别是编码器…...
基于STM32设计的粮食仓库(粮仓)环境监测系统
一、前言 1.1 项目开发背景 随着现代农业的发展和粮食储存规模的扩大,粮仓环境的智能化监控需求日益增长。传统的粮仓管理方式通常依赖人工检测和定期巡查,效率低下且容易出现疏漏,无法及时发现潜在问题,可能导致粮食受潮、霉变…...
大数据技术Kafka详解 ⑤ | Kafka中的CAP机制
目录 1、分布式系统当中的CAP理论 1.1、CAP理论 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP机制 C软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达600多个,欢迎订阅,持续更新…...
44.ComboBox的数据绑定 C#例子 WPF例子
固定最简步骤,包括 XAML: 题头里引入命名空间 标题下面引入类 combobox绑定资源属性和选择属性,block则绑定和combobox一样的选择属性 C#: 通知的类,及对应固定的任务 引入字段 引入属性 其中资源是只读的 选…...
SOLID原则学习,接口隔离原则(Interface Segregation Principle, ISP)
文章目录 1. 定义2. 为什么要遵循接口隔离原则?3. 违反接口隔离原则的例子4. 遵循接口隔离原则的改进5. 总结 1. 定义 接口隔离原则(Interface Segregation Principle, ISP) 接口隔离原则是面向对象设计中的五大原则(SOLID&#…...
Spring Boot Web技术栈(官网文档解读)
摘要 Spring Boot框架既支持传统的Servlet技术栈,也支持新兴的响应式(Reactive)技术栈。本篇文章将详细讲述Spring Boot 对两种技术栈的详细支持和使用。 Servlet 概述 基于Java Servlet API构建,它依赖于传统的阻塞I/O模型&…...
闲谭SpringBoot--ShardingSphere分布式事务探究
文章目录 0. 背景1. 未分库分表时2. 仅分表时3. 分库分表时3.1 不涉及分库表3.2 涉及分库表,且分库表处于一个库3.3 涉及分库表,且分库表处于多个库3.4 涉及分库表,且运行中某库停机 4. 小结 0. 背景 接上篇文章《闲谭SpringBoot–ShardingS…...
计算机网络之---TCP报文段
TCP报文段 TCP报文段是TCP协议中传输数据的基本单位。TCP协议基于流控制、顺序控制和错误校验等机制,以确保数据的可靠传输。TCP报文段结构由多个字段组成,每个字段在TCP的工作中都有特定的作用 一个典型的TCP报文段由两部分组成: TCP头部&a…...
USB 驱动开发 --- Gadget 驱动框架梳理(一)
本文由 Linux 内核文档翻译与总结而来,个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中,角色定义: the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver),负责与 …...
C#读写ini配置文件保存设置参数
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b5P5rkA&ftt&id22173428704 [DllImport("kernel32", CharSet CharSet.Unicode)] public static extern uint GetPrivateProfileString(string lpAppName, stri…...
Linux---history查看命令历史记录命令
history命令是Linux系统中用于显示和管理用户之前执行过的命令列表的实用工具。以下是history命令的详细教程: 一、基本功能 history命令能够显示用户在当前shell会话或之前会话中执行过的所有命令。这对于回顾之前的操作、复制某个命令进行修改再次执行等场景非常…...
CANopen 学习笔记(2)
PDO通讯参数 异步传输 发送类型设置为0xFE或0xFF 修改映射参数后执行sendPDOevent(&CanFestival_Master_Data); /* 发送PDO事件 */则会触发PDO传输 还有一直就是定时器异步发送,配置发送类型为0xFE,定时器发送时间为0x64,则会以100ms的周期发送P…...
《鸿蒙Next旅游应用:人工智能赋能个性化与智能导览新体验》
随着鸿蒙Next的推出,旅游应用迎来了全新的发展机遇,借助人工智能技术能为用户带来更出色的个性化推荐和智能导览服务。 鸿蒙Next与人工智能融合优势 鸿蒙Next拥有强大的分布式能力和原生智能体验。其能打破设备界限,实现多设备协同…...
计算机网络 (39)TCP的运输连接管理
前言 TCP(传输控制协议)是一种面向连接的、可靠的传输协议,它在计算机网络中扮演着至关重要的角色。TCP的运输连接管理涉及连接建立、数据传送和连接释放三个阶段。 一、TCP的连接建立 TCP的连接建立采用三次握手机制,其过程如下&…...
Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250114
逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/18YtQiLnt06cPQP1nRXor0g?pwd4k3h 提取码: 4k3h Level2逐笔成交逐笔委托数据分享下载 基于Level2的逐笔成交和逐笔委托数据,这种毫秒级别的记录能分析出许多关键信息,如庄家意图、虚假动作&#…...
探索Java(适合小白)
探索Java:推动数字世界的语言 Java,这一编程语言在信息技术的海洋中如同明珠般闪耀,吸引着无数程序员的关注与热爱。在今天的博客中,我们将深入了解Java的定义、学习的重要性,并详细探讨Java EE的概念。无论你是编程新…...
Java Web开发高级——Spring Boot与微服务架构
微服务架构(Microservices Architecture)已经成为现代软件开发中的主流架构之一。它通过将单一的、庞大的应用程序拆分成多个小的、独立部署的服务,使得开发、维护和扩展变得更加灵活、可控。Spring Boot 提供了一种简单且高效的方式来构建微…...
IMX6U Qt 开发环境
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、交叉编译 1. 安装通用 ARM 交叉编译工具链 2. 安装 Poky 交叉编译工具链 二、编译出厂源码 1. U-boot 2. 内核和模块 3. 编译出厂 Qt GUI 综合 Demo 前言…...
【计算机网络】lab5 ARP协议
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...
基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用
在使用 PySide6 进行开发时,管理应用程序的资源(如图标、图片、字体、样式表、音视频等)是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc,它能够将资源文件(.qrc)编译成 Python 模块,然后…...
【C】初阶数据结构3 -- 单链表
之前在顺序表那一篇文章中,提到顺序表具有的缺点,比如头插,头删时间复杂度为O(n),realloc增容有消耗等。而在链表中,这些问题将得到解决。所以在这一篇文章里,我们将会讲解链表的定义与性质,以及…...
STM32 FreeRTOS 基础知识
多任务处理 内核是操作系统的核心组件。诸如 Linux 这样的操作系统采用的内核, 看似允许用户同时访问计算机。很明显,多个用户可以同时执行多个程序。 每个执行程序都是受操作系统控制的任务(或线程)。如果一个操作系统能够以这…...
初学stm32 --- II2C_AT24C02,向EEPROM中读写数据
目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK(Acknowledge) 2. NACK(Not Acknowledge) IO口模拟II2C协议 发送起始信号: 发送停止信号: 检测应答信号: 发送应答信号&#x…...
探索图像编辑的无限可能——Adobe Photoshop全解析
文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里,视觉内容无处不在,而创建和编辑这些内容的能力已经成为许多行业的核心技能…...
当comfyui-reactor-node 安装失败urllib.error.HTTPError: HTTP Error 403: Forbidden解决方法
comfyUI 节点comfyui-reactor-node 安装 python install 时 报错 urllib.error.HTTPError: HTTP Error 403: Forbidden 如下: (xxx) xxxxxxx:~/sdb/Q/ComfyUI/custom_nodes/comfyui-reactor-node$ python install.py Traceback (most recent call last): File …...
01基本介绍篇(D2_多线程问题)
目录 一、线程的上下文切换问题 1. 基本介绍 2. 多线程一定比单线程快? 3. 如何减少上下文切换 二、线程安全问题 1. 什么是线程安全? 2. java语言中的线程安全 2.1. 不可变 2.2. 绝对线程安全 2.3. 相对线程安全 2.4. 线程兼容 2.5. 线程对立…...
如何保证光谱相机的稳定性和可靠性
光学系统设计与制造 高质量光学元件:采用高精度研磨和镀膜的透镜、棱镜、光栅等光学元件。优质的透镜可以减少像差和色差,确保光线准确聚焦;高质量的镀膜能够提高光学元件的透光率,降低反射损失,并且增强对不同波段光…...
基于springboot+vue的洪涝灾害应急信息管理系统设计与实现
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
登录、注册、忘记密码、首页HTML模板
<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录</title><style>body {display: fl…...
HTML文章翻页功能
效果展示: 效果原理: 1、引入CDN 2、绘制文章翻页样式,以及自动分段 3、获取窗口宽高,计算出当前文章总分段,并实现分页 4、完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8&qu…...
JAVA安全编码规范
1. 数据校验 对外部输入进行校验入参的合法性, 防止内存越界,命令注入,SQL注入,格式化字符串漏洞 校验长度,范围,输入校验采用白名单形式 校验前做归一化处理,使用java.text.Normalizer的n…...
OpenGL —— 基于Qt的视频播放器 - ffmpeg硬解码,QOpenGL渲染yuv420p或nv12视频(附源码)
运行效果 工程说明 源码 vertex.glsl...
爬虫逆向学习(十五):Akamai 3.0反爬分析与sensor-data算法逆向经验
此分享只用于学习用途,不作商业用途,若有冒犯,请联系处理 Akamai 3.0反爬分析与sensor-data算法逆向经验 Akamai开始正题前须知站点信息接口分析反爬点反爬点定位_abck定位结果 逆向前准备工作sensor_data生成位置本地替换文件 请求体sensor…...
java项目启动时,执行某方法
1. J2EE项目 在Servlet类中重写init()方法,这个方法会在Servlet实例化时调用,即项目启动时调用。 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet;public class MyServlet extends HttpServlet {Overridepublic void …...
学会使用开源软件jclasslib 字节码文件的组成 详解
应用场景 1 应用场景 2 学习路线 以正确的姿势打开文件 字节码文件的组成 玩转字节码常用工具 以正确的姿势打开文件 开源软件 jclasslib github 地址 https://github.com/ingokegel/jclasslib 工具使用 字节码文件的组成 基本信息 常量池 字段 方法 属性 详解 魔数 主副版…...
Flask表单处理与验证
Flask是一个轻量级的Python框架,它通过扩展库提供了对表单处理与验证的支持。WTForms是一个流行的Flask扩展库,用于创建和验证Web表单。它提供了一种声明式的方法来定义表单结构和验证逻辑,使得表单处理更为简洁和优雅。下面,我们…...
如何通俗易懂的理解 html js css
HTML、CSS 和 JavaScript 是构建网页的三大核心技术。为了通俗易懂地理解它们,我们可以用一个简单的比喻:**盖房子**。 --- ### 1. **HTML:房子的结构** HTML(HyperText Markup Language)就像房子的**骨架**。它定义…...
信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高
《港湾商业观察》施子夫 1月8日,深交所官网显示,浙江信凯科技集团股份有限公司(以下简称“信凯科技”)主板IPO提交注册。 自2022年递交上市申请,信凯科技的IPO之路已走过两年光景,尽管提交注册࿰…...
蓝牙BT04-A的使用与相关AT指令
一、AT指令没有返回的问题及解决方案 检查指令格式: 确认指令格式是否正确,包括特定的命令和结尾的回车换行符(n)。 检查TX/RX连接: 确认TX(发送)和RX(接收)线是否连接正…...
新手如何练习SQL?|掌握
对于新手想要练习SQL语句,可以从以下几个方面入手: 1. 建立理论基础 首先深入理解数据库的核心组件,包括数据库本身、其内部的各个表、表中的字段及其对应的数据类型(如字符串、整型、日期等),以及数据库…...
JavaScript宝典下
小哆啦闭关修炼已久,潜心攻读专业秘技,方才下山考研本欲大展宏图,怎奈山河虽壮志难酬,终是觉察考研无望。思来想去,不若弃考研之念,重拾敲代码之道,复盘前端奇术,以备闯荡职场江湖。…...
浅谈云计算12 | KVM虚拟化技术
KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具(QEMU、Libvirt等) 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…...
Spring Boot 动态表操作服务实现
Spring Boot 动态表操作服务实现 Spring Boot 动态表操作服务实现1. 环境配置2. JdbcTemplate 的使用2.1 创建动态表2.2 动态添加字段2.3 动态删除字段2.4 动态修改字段类型2.5 删除表的方法实现 3. 小结3.1 可能的优化 Spring Boot 动态表操作服务实现 在现代的应用开发中&am…...
62_Redis服务器集群优化
Redis集群虽然具备高可用特性,且能实现自动故障恢复,但是如果使用不当,也会存在一些问题,总结如下。 集群完整性问题集群带宽问题数据倾斜问题客户端性能问题命令的集群兼容性问题Lua和事务问题1.集群完整性问题 在 Redis 集群的默认配置下,当节点检测到存在至少一个哈希…...
晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)
晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...
Linux Top 命令 load average 指标解读
前言 作为平台开发的同学,维护平台稳定性是我们最基本的工作职责,下面主要介绍下top 命令里 ,load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载,它表示运…...