如何使用 ffmpeg 和 GPU 处理流

如何使用 ffmpeg 和 GPU 处理流

因此在我的项目中,我需要捕获视频流、解码视频、通过对象检测算法运行各个帧,然后将输出播放为视频。

整个操作都在一台 Linux 服务器上运行,该服务器配备了几台 Tesla V100、40 核 CPU(现在想不起具体型号)和大量 RAM。它应该以 25fps(逐行)的速度播放 720x576i 的视频,因此还需要即时进行去隔行处理。

不用说,对象检测是迄今为止这里发生的最慢的操作,但我目前正在寻找如何最好地进行转码。

现在,由于我可以使用如此强大的 GPU,我认为利用它是明智之举,但我也在一些地方看到,在 GPU 上进行转码很糟糕。

无论如何,我已经安装了 cuda 9.0,因此我构建了 ffmpeg 并启用了以下选项:

--enable-libavcodec  --enable-libx264 --enable-gpl --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp

(我 95% 确定这些都是,但如果这真的很重要,我会在访问服务器后进行检查,这应该需要几天的时间)

从这里开始的最佳方法是什么?我对 ffmpeg 不太熟悉,对所有与 gpu 相关的选项就更不熟悉了。

我尝试使用 进行去隔行处理-vf: yadif_cuda,但失败了,提示此过滤器不可用。我以为如果我在构建选项中启用 cuda,它就会可用。

我不知道解码时要使用哪些选项(例如,-hwaccel???,-c:v libx264h264_cuvid等),而且我也不确定检测算法输出帧后应该如何显示这些帧。我是否只是“播放”它们?我是否需要重新编码,如果是,如何重新编码?

任何帮助都将不胜感激,如果需要更多信息,我很乐意提供我所能提供的信息。

我制作了一个图表来阐明整个事情应该如何进行:

该算法使用 Python,可能使用 skvideo 进行捕获和播放。但如果有必要,我也可以直接使用 ffmpeg(使用从 Python 脚本执行的 bash 命令)。

捕获和播放之间的所有过程都应该实时发生,即在视频传输给最终用户时。

相关内容