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

打印 上一主题 下一主题

主题 554|帖子 554|积分 1662

本文使用 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硬件加速转码

简朴的开始

好了,在了解基础信息之后,可以开始转码了。下面是最简朴的下令:
  1. 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),所以我们要订定码率和帧数:
  1. 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 分钟之后的内容,那么如果使用硬件解码器,会出现下面的题目:
  1. [h264_cuvid @ 0x55ed4090d540] cuvid decode callback error
  2. 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:这里先容了直播必要的装备规格和一些额外的链接。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表