FFmpeg 无法实时转码

FFmpeg 无法实时转码

我一直在为朋友设置一个类似于我的录音版本,但尽管有足够的硬件(据我所知),我似乎无法让它实时工作。

系统规格:8600K、GTX 1050ti、16GB RAM、1TB 860 EVO

测试命令(为简单起见已更新):

ffmpeg -y -hide_banner -thread_queue_size 9999 -f dshow -rtbufsize 2147.48M -video_size 1920x1080 -framerate 60 `
-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" `
-thread_queue_size 9999 -f dshow -rtbufsize 2147.48M -video_size 1920x1080 -framerate 60 `
-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&24df76f&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" `
-map 0 -c:v h264_nvenc -r 60 -preset: llhp -pix_fmt yuv420p -b:v 1M -minrate 1M -maxrate 1M -bufsize 1M `
C:\Users\Jordan\Videos\FFmpeg\Left\Left.ts `
-map 1 -c:v h264_nvenc -r 60 -preset: llhp -pix_fmt yuv420p -b:v 1M -minrate 1M -maxrate 1M -bufsize 1M `
C:\Users\Jordan\Videos\FFmpeg\Right\Right.ts

此命令的目的是记录 2 个单独的同步输出。但是,出于某种原因,此命令不会实时转码视频,当您尝试录制而不是简单地转换文件时,这是一个大问题。当我省略两个输出中的一个或将每个输入/输出的分辨率减半时,一切都会实时工作。这让我相信系统中某处存在瓶颈,但在任务管理器中监控所有内容时,没有什么接近上限(GPU 编码器、cpu、ram 和 SSD 使用率低于 30%)。

此外,当我尝试通过 OBS 在一个 4K60 视频中录制两个流时,一切都运行良好,就像实时一样。所以我不明白在 FFmpeg 中转码两个 1080p60 流怎么会比在 OBS 中转码一个 4K60 流更费力……

此后,我将 1050ti 换成了 GTX 1080,性能没有任何变化。这让我相信是 CPU 出了问题。看起来 FFmpeg 实际上只使用了 1-2 个线程……有什么办法可以强制它使用更多线程吗?无论我将 -threads 注入命令的哪个位置,它似乎都没有任何影响。真正奇怪的是,我有一个非常相似的命令,但我正在使用 GTX 1080 和 6800K 执行两个 4K60 流,而不是两个 1080p60 流……据我所知,与 6800K 相比,8600K 的每线程性能更高,所以我不确定我如何能够获得如此多的效果。

如有任何见解我将不胜感激。

答案1

问题出在采集卡上,我从他的系统中取出一张并将其放入我的系统中,并能够重现该问题。我的其他采集卡无法重现此问题,我有 4 张这样的采集卡。

问题似乎是由存储在卡本身上的 Avermedia 流引擎过度软件引起的。该卡实际上显示为两个设备,一个名称中没有流引擎,另一个有,如果您选择有流引擎的那个,问题会得到缓解但仍然存在。无论如何,鉴于我可以确认 Elgato 的 HD60 Pro 上不存在此问题,我们已订购了其中 2 个。

回想起来,过度使用的软件/非常规固件很容易解释极难诊断的问题。幸运的是,我们以折扣价购买了 Avermedia Live Gamer HD 2s,可以转售并获得全额退款,真是太好了。

相关内容