使用GPU加速的ffmpeg视频处理

83

我想使用ffmpeg结合NVIDIA GPU来加速视频的编码和解码。

根据NVIDIA官网的介绍:

NVIDIA GPU包含一个或多个硬件解码器和编码器(与CUDA核心分离),为多种流行的编解码器提供完全加速的硬件编解码。通过卸载解码/编码操作,图形引擎和CPU可以用于其他操作。

我的问题是:我能否使用CUDA核心来进行视频编码和解码,也许更快?


7
是的,您可以使用CUDA核心来进行视频编码和解码,就像您可以使用几乎任何可编程处理器一样。您计划亲自编写这个软件吗? - Robert Crovella
谢谢。我想同时转码许多视频,自己编写编码/解码太困难了。CUDA Video Decoder API 似乎有所帮助,我是对的吗? - Wang Hai
3
当前NVIDIA的编码/解码支持仅通过NVENC和NVDEC实现,它们是硬件子系统,与CUDA无直接关系并且独立于CUDA核心。 NVIDIA不再提供任何支持的库来加速使用CUDA进行视频编码/解码。因此,您需要自己编写CUDA代码或查找第三方库来完成。如果您要求第三方库的链接,那么这个问题就不适合在SO上讨论。除非您真的想自己编程,否则这个问题对于SO来说是不适合的。 - Robert Crovella
1
@llogan,为什么你把旧问题标记为最近的问题的重复?? - Mike Versteeg
3
@llogan你公开声明“此问题已经被提出并已有答案。如果这些答案没有完全回答您的问题,请提一个新问题。”来惩罚这个发布者是不正确的,因为这个说法不正确,但它确实给人留下了OP懒惰并没有做足够的研究的印象。所以我认为这很重要。如果这个标记只是作为更好答案的链接,那么它的措辞非常糟糕。 - Mike Versteeg
显示剩余4条评论
4个回答

44

支持的GPU请查看支持的GPU矩阵

CUDA

ffmpeg -hwaccel cuda -i input output

CUVID

ffmpeg -c:v h264_cuvid -i input output

使用NVDEC和NVENC进行完整的硬件转码:

ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -c:v h264_nvenc -preset slow output
如果编译FFmpeg时支持libnpp,则可以将基于GPU的缩放器插入链中:
ffmpeg -hwaccel_device 0 -hwaccel cuda -i input -vf scale_npp=-1:720 -c:v h264_nvenc -preset slow output.mkv

来源: https://trac.ffmpeg.org/wiki/HWAccelIntro


这个答案基本上是从源代码中复制粘贴的。 - Matt Groth

41

FFmpeg提供了一个硬件加速的子系统,其中包括NVIDIA:https://trac.ffmpeg.org/wiki/HWAccelIntro

为了启用支持使用NVIDIA GPU辅助编码,您需要:

  • 支持的GPU
  • 适用于您操作系统的驱动程序
  • NVIDIA Codec SDK
  • 已配置带有--enable-nvenc参数的FFmpeg(如果在配置时检测到驱动程序,则默认开启)

18

正如Mike提到的那样,FFmpeg包装了一些这些硬件加速技术。您应该使用它,而不是首先采用更低级别的方法(官方NVIDIA库)!

表格显示,NVENC可能是您的选择。

但是:要小心并进行一些基准测试。虽然GPU编码器应该非常快,但与CPU编码器相比,它们在视觉质量方面也更差。

需要检查的问题是:当针对某个给定比特率时,GPU编码器是否与CPU编码器相竞争?我认为不是(除非是非常高的比特率或非常糟糕的质量),但这取决于您的用例。 GPU编码不是一个提供仅优点的万能药。


1
我已经尝试过使用具有硬件加速的ffmpeg,例如解码和转码,在我的笔记本电脑上(i5-4200U CPU,740M GPU)与软解码相比,它几乎以相同的速度运行,但负载更少。从视频编解码器SDK中,我怀疑它可能只是使用了NVENC和NVDEC,而没有使用CUDA核心。因此,我想利用CUDA核心。 - Wang Hai
2
如果有专门的硬件,为什么要使用Cuda核心?看起来... 您没有提供关于您的用例足够的信息,并且似乎缺少一些基础知识。要么投入更多并更加精确(包括分析,ffmpeg说了什么),要么让您的生活变得轻松:对于您的编解码器(我们甚至不知道是什么),请使用CPU和预设superfast或类似的设置。 - sascha
1
硬件编码器通常生成的输出质量明显低于像x264这样的优秀软件编码器,但通常更快且不使用太多CPU资源。(也就是说,它们需要更高的比特率才能产生具有相同感知质量的输出,或者以相同比特率产生具有较低感知质量的输出。)(来源:https://trac.ffmpeg.org/wiki/HWAccelIntro) - mustafa candan

4

对于 AMD 显卡,使用以下-vcodec 选项:

Windows:
h264_amf
hevc_amf

Linux:
h264_vaapi
hevc_vaapi

ffmpeg -i input.mp4 -b:v 10400k -vcodec h264_amf -vf crop=1920:848:0:116 -c:a copy output.mp4

ffmpeg -i input.mp4 -b:v 10400k -vcodec hevc_amf -vf crop=1920:848:0:116 -c:a copy output.mp4

ffmpeg -i input.mp4 -b:v 10400k -vcodec h264_vaapi -vf crop=1920:848:0:116 -c:a copy output.mp4

ffmpeg -i input.mp4 -b:v 10400k -vcodec hevc_vaapi -vf crop=1920:848:0:116 -c:a copy output.mp4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接