0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FFmpeg的硬件加速转码

星星科技指导员 来源:NVIDIA 作者:NVIDIA 2022-04-28 15:03 次阅读

所有从 Kepler 一代开始的 NVIDIA GPUs 都支持完全加速的硬件视频编码,而从费米一代开始的所有 GPUs 都支持完全加速的硬件视频解码。截至 2019 年 7 月,Kepler、Maxwell、Pascal、Volta 和 Turing 一代 GPUs 支持硬件编码,Fermi、Kepler、Maxwell、Pascal、Volta 和 Turing 一代 GPUs 支持硬件解码。

高质量视频应用的处理需求对广播和电信网络提出了限制。消费者行为已经发生了变化,这在 OTT 视频订阅和实时流媒体迅速普及的趋势中表现得很明显。现在所有的社交媒体应用程序都在各自的平台上加入了这一功能。随着消费者从观看点播视频转向观看直播视频,直播将推动手机Wi-Fi 的整体视频数据流量增长。

分发给观众的视频内容通常被转换成几个自适应比特率( ABR )配置文件以进行传输。生产中的内容可能以大量编解码器格式之一到达,这些格式需要转换为另一种格式以供分发或存档。

这使得视频转码成为高效视频管道中的一个关键部分——无论是 1 : N 还是 M : N 配置文件。理想的转码解决方案需要在成本(美元/流)和能效(瓦特/流)方面具有成本效益,同时为数据中心提供具有最大吞吐量的高质量内容。视频提供商希望降低向更多屏幕提供更多高质量内容的成本。

在各个方面生成的大量视频内容需要对视频编码、解码和转码进行健壮的硬件加速。让我们看看 NVIDIA GPUs 是如何整合专用视频处理硬件的,以及如何利用它。

NVIDIA 编解码硬件

NVIDIA GPUs 船上配备了片上硬件编码器和解码器单元,通常称为 NVENC 和 NVDEC 。与 CUDA 核心分开, NVENC / NVDEC 运行编码或解码工作负载,而不会减慢同时运行的图形或 CUDA 工作负载的执行。

NVENC 和 NVDEC 支持许多重要的编解码编解码器。 NVIDIA 。最新的支持矩阵可以在 GPU 上找到。

poYBAGJqPDyANJ-RAAFxnPBG7l8839.png

图 1 : GPU 硬件功能

基于 FFmpeg 的硬件加速转码

在对视频数据进行转码时,通常使用 FFmpeg 库 。硬件加速极大地提高了工作流的性能。图 2 显示了 FFmpeg 转换过程的不同元素。

poYBAGJqPD6AVMdOAABAeoOajMk422.png

图片 2 :使用 NVIDIA 硬件加速的 FFmpeg 流水线转码

FFmpeg 通过 h264_cuvid 、 hevc_cuvid 和 h264_nvenc 、 hevc_nvenc 模块支持硬件加速解码和编码。从源代码构建时激活对硬件加速的支持需要一些额外的步骤:

克隆 FFmpeg git 存储库 https://git.ffmpeg.org/ffmpeg.git

从 NVIDIA 网站 下载并安装兼容的驱动程序

下载并安装 CUDA 工具箱

克隆 nv-codec-headers 存储库 并仅使用此存储库作为头进行安装: make install

使用以下命令配置 FFmpeg (使用正确的 CUDA 库路径):

./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64
  • 使用多个进程进行构建,以提高构建速度并抑制过度输出:make -j-s

使用 FFmpeg 进行软件 1 : 1 转码非常简单:

ffmpeg -i input.mp4 -c:a copy -c:v h264 -b:v 5M output.mp4

但这将是缓慢的,因为它只使用基于 CPU 的软件编码器和解码器。使用硬件编码器 NVENC 和解码器 NVDEC 需要添加更多参数来告诉 ffmpeg 使用哪个编码器和解码器。最大化转码速度还意味着确保解码后的图像保存在 GPU 存储器中,以便编码器能够有效地访问它。

ffmpeg -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4

如果没有 -hwaccel-cuvid 选项,解码后的原始帧将通过 PCIe 总线复制回系统内存,如图 3 所示。稍后,相同的图像将通过 PCIe 复制回 GPU 内存,以便在 GPU 上进行编码。这两个额外的传输由于传输时间而造成延迟,并将增加 PCIe 带宽占用。

图3 :没有 hAccel 的内存流(& M )

添加 -hwaccel-cuvid 选项意味着原始解码帧将不会被复制,转码将更快、使用更少的系统资源,如图 4 所示。

hwaccel 的内存流

给定 PCIe 带宽限制,复制未压缩的图像数据会使 PCIe 总线迅速饱和。防止系统和 GPU 内存之间不必要的复制,使用 -hwaccel-cuvid 的吞吐量比不使用 -hwccel-cuvid 的未优化调用高出 2 倍。

处理筛选器

代码转换通常不仅涉及到更改输入流的格式或比特率,还包括调整其大小。有两个选项可用于调整 GPU 上的大小:使用 npp_scale 过滤器或 nvcuvid resize 选项。当从一个输入到一个具有不同分辨率( 1 : 1 转码)的输出流转码时,可以使用 nvcuvid resize 选项。请参见下一行的示例。

ffmpeg -vsync 0 –hwaccel cuvid -c:v h264_cuvid –resize 1280x720-i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4

如果需要多个输出分辨率( 1 : N 转码),则scale_npp滤波器可以调整 GPU 上解码帧的大小。通过这种方式,我们可以生成具有多个不同分辨率的多个输出流,但对所有流只使用一个调整大小的步骤。关于 1 : 2 转码的示例,请参见下一行。

ffmpeg -vsync 0 –hwaccel cuvid -c:v h264_cuvid -i input.mp4 \-c:a copy –vf scale_npp=1280:720-c:v h264_nvenc -b:v 5M output_720.mp4 \-c:a copy -vfscale_npp=640:320-c:v h264_nvenc -b:v 3M output_360.mp4

使用-vf "scale_npp=1280:720"将设置scale_npp作为解码图像的过滤器

插值算法可以作为附加参数为scale_npp定义。默认情况下使用三次插值,但其他算法 MIG ht 会根据比例因子和图像提供更好的结果。建议在缩小尺度时使用超级采样算法以获得最佳质量。示例如下:

ffmpeg -vsync 0 –hwaccel cuvid -c:v h264_cuvid -i input.mp4-c:a copy –vf scale_npp=1280:720:interp_algo=super-c:v h264_nvenc -b:v 5M output_720.mp4

混合 CPU 和 GPU 处理

有时 MIG 需要混合使用 CPU 和 hwupload_cuda 处理。例如,您可能需要在 CPU 上解码,因为 -hwaccel cuvid 解码器不支持该格式,或者 GPU 上没有滤波器。在这种情况下,不能使用 GPU 标志。相反,您需要使用 GPU 过滤器将数据从系统上传到 GPU 内存。在下面的示例中,由于未设置 -hwaccel cuvid ,因此在 GPU 上解码 H 。 264 流并将其下载到系统内存中。淡入滤波器应用于系统存储器中,并使用 hwupload_cuda 滤波器将处理后的图像上传到 GPU 存储器。最后,使用 scale_npp 缩放图像并在 GPU 上编码。

ffmpeg -vsync 0 -c:v h264_cuvid -i input.264-vf "fade,hwupload_cuda,scale_npp=1280:720"-c:v h264_nvenc output.264

多 -GPU

当在一个系统中使用多个 GPUs 时,编码和解码工作必须显式地分配给 GPU 。 GPUs 由其索引号标识;默认情况下,所有工作都在索引为 0 的 GPU 上执行。使用以下命令获取系统中所有 NVIDIA GPUs 及其相应的 ID 号的列表:

ffmpeg -vsync 0 -i input.mp4 -c:v h264_nvenc -gpu list -f null –

一旦知道了索引,就可以使用-hwaccel_device索引标志来设置解码和编码的活动 GPU 。在下面的例子中,工作将在索引为 1 的 GPU 上执行。

ffmpeg -vsync 0 -hwaccel cuvid -hwaccel_device 1 -c:v h264_cuvid -i input.mp4-c:a copy -c:v h264_nvenc -b:v 5M output.mp4

优化

为了获得最佳的吞吐量,所有的编码器和解码器单元都应该被尽可能地利用。 nvidia-smi 可用于生成有关 NVENC 、 NVDEC 和一般 GPU 利用率的实时信息

nvidia-smi dmon nvidia-smi -q -d UTILIZATION

根据这些结果可以采取多种措施。如果编码器利用率低, MIG 可以引入另一个转码管道,该管道使用 CPU 解码和 NVENC 编码来为硬件编码器生成额外的工作负载。

使用 CPU 筛选器时, PCIe 带宽 MIG ht 成为瓶颈。如果可能,筛选器应在 GPU 上运行。 FFmpeg 中有几个 CUDA 过滤器,可以用作模板来实现您自己的高性能 CUDA 过滤器。

通过使用 GPU SDK 的 NVIDIA 可视化分析器分析 ffmpeg 应用程序,您可以始终跟踪主机和设备之间的 GPU 利用率和内存传输。只需启动“ Run application to generateCPU andGPU timeline ”,然后选择带有相关 CLI 选项的 ffmpeg 应用程序。图 5 说明了应用程序

图 5 :

绿松石块显示 CUDA 内核完成的颜色空间转换,而黄色块显示主机和设备之间的内存传输。使用 visualprofiler ,用户可以轻松地跟踪在 GPU 上执行的操作,例如 CUDA 加速的过滤器和数据传输,以确保不会执行过多的内存拷贝。

通过使用 --disable-stripping CLI 选项编译 ffmpeg 来收集 CPU – 端性能统计信息,以启用性能分析。

这可以防止编译器剥离函数名,以便像 Gprof 或 visualstudioprofiler 这样的商品探查器可以收集性能统计信息。 CPU 在硬件加速开启的情况下,负载水平应较低,并且大部分时间应花费在视频代码 SDK API 调用中,这些调用标记为“外部代码因为函数名从驱动程序库中被删除。图 6 显示了一个示例屏幕截图。

图 6 : visualstudio 的 ffmpeg 性能评测

进一步阅读

有关如何使用 FFmpeg 的更多示例以及可用的高级质量设置,请查看“ 使用 FFmpeg 和 NVIDIA GPU 硬件加速 “向导。

结论

FFmpeg 是一个强大而灵活的开源视频处理库,具有硬件加速的解码和编码后端。它允许快速的视频处理和完整的 NVIDIA GPU 硬件支持,只需几分钟。 Gprof 、 visualprofiler 和 microsoftvisualstudio 等商品开发工具可以用于精细的性能分析和调优。看看 ffmpeg 源 试试吧!

关于作者

俄罗斯南部罗曼大学( Rostov-on-Don , 2012 )和罗曼大学应用数学硕士学位。之后,他在俄罗斯三星研发院( 2012-2015 )、英特尔公司( 2015-2017 )工作。目前,他在莫斯科担任开发技术工程师。他的研究兴趣包括视频编码、高性能和 GPGPU 。

Stefan Schoenefeld 是 DevTech Engeniner 和 NVIDIA 专业解决方案组的经理,他和他的团队致力于帮助媒体和娱乐、电信和其他行业的开发人员开发和改进视频和图像处理、机器学习和视频转码的高速应用程序。他拥有乌尔姆大学工程、计算机科学和心理学系的计算机科学文凭。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    4862

    浏览量

    102739
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4684

    浏览量

    128630
  • CUDA
    +关注

    关注

    0

    文章

    121

    浏览量

    13587
收藏 人收藏

    评论

    相关推荐

    基于Xilinx XCKU115的半高PCIe x8 硬件加速

    基于Xilinx XCKU115的半高PCIe x8 硬件加速卡,支持2x72bit(数据位宽64bit+ECC)DDR4存储,数据传输速率 2400Mb/s。DDR4单簇容量4GB,两组总容量为8GB
    的头像 发表于 11-14 11:30 79次阅读
    基于Xilinx XCKU115的半高PCIe x8 <b class='flag-5'>硬件加速</b>卡

    RISC-V跑AI算法能加速吗?

    现在好多ARM单片机都带机器学习加速,RISC-V有这方面的硬件加速吗?
    发表于 10-10 22:14

    TDA4VM上的硬件加速运动恢复结构算法

    电子发烧友网站提供《TDA4VM上的硬件加速运动恢复结构算法.pdf》资料免费下载
    发表于 09-24 11:39 0次下载
    TDA4VM上的<b class='flag-5'>硬件加速</b>运动恢复结构算法

    AM62A SoC通过硬件加速视觉处理改进条形码读取器

    电子发烧友网站提供《AM62A SoC通过硬件加速视觉处理改进条形码读取器.pdf》资料免费下载
    发表于 09-04 09:52 0次下载
    AM62A SoC通过<b class='flag-5'>硬件加速</b>视觉处理改进条形码读取器

    适用于数据中心应用中的硬件加速器的直流/直流转换器解决方案

    电子发烧友网站提供《适用于数据中心应用中的硬件加速器的直流/直流转换器解决方案.pdf》资料免费下载
    发表于 08-26 09:38 0次下载
    适用于数据中心应用中的<b class='flag-5'>硬件加速</b>器的直流/直流转换器解决方案

    如何移植FFmpeg

    FFmpeg是一款专门用于处理数字音频和视频,支持录制、转换,并能将这些媒体内容转化为实时流数据的开源计算机程序。它遵循LGPL或GPL许可协议,为用户提供了涵盖音视频录制、格式转换及流媒体分发
    的头像 发表于 06-07 15:28 1598次阅读
    如何移植<b class='flag-5'>FFmpeg</b>

    PSoC 6 MCUBoot和mbedTLS是否支持加密硬件加速

    。 使用 MCUBoot 验证两个应用程序时,运行时间大约需要五秒钟。 在 README.md 的 \"安全 \"一栏中写道 与软件实现相比,硬件加速加密技术将启动时间缩短了四倍多
    发表于 05-29 08:17

    新思科技硬件加速解决方案技术日在成都和西安站成功举办

    近日,【新思科技技术日】硬件加速验证解决方案专场成都站和西安站顺利举行,来自国内领先的系统级公司、芯片设计公司以及高校的250多名开发者们积极参与。
    的头像 发表于 04-19 17:35 418次阅读

    Elektrobit利用其首创的硬件加速软件优化汽车通信网络的性能

    Elektrobit今日宣布推出 EB zoneo GatewayCore——首款支持、配置和集成现代微控制器新一代硬件加速器的软件产品,可应用于先进的汽车电子/电气架构(基于被广泛采用
    的头像 发表于 04-17 09:51 325次阅读

    用DE1-SOC进行硬件加速的2D N-Body重力模拟器设计

    该项目的目标是创建一个用DE1-SOC进行硬件加速的2D N-Body重力模拟器。
    的头像 发表于 04-09 11:08 486次阅读
    用DE1-SOC进行<b class='flag-5'>硬件加速</b>的2D N-Body重力模拟器设计

    330-基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口卡 图形图像硬件加速

    标签: Net FPGA , XC7K325T板卡 , XC7K325T处理板 , 软件无线电处理平台 , 图形图像硬件加速
    的头像 发表于 03-04 14:14 560次阅读
    330-基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口卡 图形图像<b class='flag-5'>硬件加速</b>器

    【国产FPGA+OMAPL138开发板体验】(原创)7.硬件加速Sora文生视频源代码

    算法,如循环神经网络(RNN)或Transformer,用于文本处理,以及卷积神经网络(CNN)或生成对抗网络(GAN)用于视频生成。通常涉及对模型中的计算密集型部分进行硬件加速。文本到视频生成模型
    发表于 02-22 09:49

    音视频解码器硬件加速:实现更流畅的播放效果

    随着多媒体内容的日益丰富和高清化,传统的软件解码已经难以满足人们对流畅播放体验的需求。因此,音视频解码器硬件加速技术的出现,为提升播放效果带来了革命性的改变。 硬件加速的原理 硬件加速的核心
    的头像 发表于 02-21 14:40 888次阅读
    音视频解码器<b class='flag-5'>硬件加速</b>:实现更流畅的播放效果

    《深入理解FFmpeg阅读体验》ffmpeg安装

    书中讲了如何编译安装,我看了一下比较复杂,所以下载安装包进行安装,下载网址:Download FFmpeg 下载完后解压出来在bin目录下面有三个文件: 复制这个目录: C:\\\\Users
    发表于 01-25 21:35

    在Sigma 300里面使用硬件加速器slew,slew mode为RC type时不同的time constant的值有什么用?

    请问下在Sigma 300里面使用硬件加速器slew,slew mode为RC type时,对应的time constant 与数据从当前值到目标值得时间有什么关系,或者说不同的time constant的值有什么用? 谢谢, 中 J Jj
    发表于 11-29 07:25