因此在我的项目中,我需要捕获视频流、解码视频、通过对象检测算法运行各个帧,然后将输出播放为视频。
整个操作都在一台 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 libx264
或h264_cuvid
等),而且我也不确定检测算法输出帧后应该如何显示这些帧。我是否只是“播放”它们?我是否需要重新编码,如果是,如何重新编码?
任何帮助都将不胜感激,如果需要更多信息,我很乐意提供我所能提供的信息。
我制作了一个图表来阐明整个事情应该如何进行:
该算法使用 Python,可能使用 skvideo 进行捕获和播放。但如果有必要,我也可以直接使用 ffmpeg(使用从 Python 脚本执行的 bash 命令)。
捕获和播放之间的所有过程都应该实时发生,即在视频传输给最终用户时。