中国建设局网站首页,网站用户群,建设网站需要多少钱济南兴田德润地址,wordpress教程 主页本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示#xff0c;你自己编译或者其他源的版本可能会不同。 ffmpeg 的一些介绍#xff0c;以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装#xff08;不需要编译安装…本文使用 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 Blogffmpeg 中 cuda 硬件转码的一些技术介绍。
Using FFmpeg with NVIDIA GPU Hardware Accelerationffmpeg 中 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这里介绍了直播需要的设备规格和一些额外的链接。