Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速

news/2025/1/15 6:18:57/

本文使用 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:这里介绍了直播需要的设备规格和一些额外的链接。


http://www.ppmy.cn/news/1563243.html

相关文章

自动化日常任务:使用Python和PyAutoGUI打开记事本并保存文本

自动化日常任务:使用Python和PyAutoGUI打开记事本并保存文本 概述准备工作效果代码 概述 在日常工作中,我们经常会遇到一些重复性的任务,这些任务虽然简单,但却耗费了大量时间。幸运的是,随着自动化技术的发展&#x…

设计模式中的代理模式

在Java中,代理模式(Proxy Pattern)可以通过静态代理和动态代理两种主要方式实现。 一、静态代理模式 在编译时就已经确定了代理类和被代理类的关系。 代理类和目标对象通常实现相同的接口或继承相同父类。 缺点是对于每个需要代理的目标对象…

在 Ubuntu 上安装和配置 Redis

在 Ubuntu 上安装和配置 Redis,并使用发布-订阅(Pub/Sub)功能,可以按照以下步骤进行: 一、安装 Redis 1. 更新包列表 首先,更新本地的包列表以确保获取到最新的软件包信息: sudo apt update…

API接口技术开发小红书笔记详情api采集笔记图片视频参数解析

小红书笔记详情 API 采集笔记图片视频参数解析如下: 获取 API 访问权限 注册账号:填写用户名、邮箱、密码等必要信息完成注册,并登录进入开发者控制台。创建应用并申请接口权限:填写应用名称、描述、应用类型等信息并提交审核。审…

【初体验】【学习】Web Component

序言 欢迎来到2025年的第一篇博客!新的一年,将持续深耕于新知识的学习,并不断深化对已有知识的理解。目标是构建一个更加系统化、结构化的知识体系,以更好地应对未来的挑战与机遇。 前言 需要以下基础: Web Compon…

弥散张量分析开源软件 DSI Studio 简体中文汉化版可以下载了

网址: (63条消息) DSIStudio简体中文汉化版(2022年7月)-算法与数据结构文档类资源-CSDN文库

Github 2025-01-13 开源项目周报 Top15

根据Github Trendings的统计,本周(2025-01-13统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目8TypeScript项目5C项目1Go项目1C++项目1Objective-C项目1HTML项目1Jupyter Notebook项目1OpenHands: 人工智能驱动的软件开发代理平台…

【C++】21.map和set的使用

文章目录 1. 序列式容器和关联式容器2. set系列的使用2.1 set和multiset参考文档2.2 set类的介绍2.3 set的构造和迭代器构造函数:双向迭代器迭代器: 2.4 set的增删查2.5 insert和迭代器遍历使用样例:2.6 find和erase使用样例:2.7 …