如何制定 FFmpeg 命令以零延迟流式传输到 VR 耳机?

如何制定 FFmpeg 命令以零延迟流式传输到 VR 耳机?

如何使用 ffmpeg 以尽可能低的延迟制定从一台 PC 到另一台 PC 的点对点 2K 60-90Hz 流传输命令?

完整故事:

我用亚马逊的 Eyebox、阿里巴巴的陀螺仪 + arduino 和 2K HDMI 显示器构建了一个 VR 耳机。它与 Blender Game 引擎配合得很好,但电线让我发疯。

我正在尝试使用 Raspberry Pi 或其他小型计算机使其成为无线网络。 (无论如何,我需要在后面添加一个重量来平衡耳机)

这就是我想象的设置方式 -

服务器 (PC):以尽可能低的延迟将 2K 应用程序窗口流式传输到 IP 上的端口之一

客户端 (HMD):在基准模式下运行 Mplayer,以尽可能降低延迟(根据 FFmpeg 文档)

FFmpeg 完全集成到 Blender 中,但输入流可以只是桌面屏幕截图。

我的 ISP 提供的家庭路由器支持 5Ghz Wifi。我还有一个 5Ghz Wifi CSL U 盘,可在 Linux 上即插即用。

由于延迟对于 VR 来说确实很糟糕,我想我可以通过未压缩的流式传输来减少几毫秒?由于流媒体仅通过 LAN 进行,因此我认为带宽仅受 5GHz Wifi 的限制,即 100Mb/s。

解释 ffmpeg 文档的方法有数百种,看起来你只能从经验中真正理解要使用哪些选项。我看不到其他人尝试同样的事情。

我可以花一周时间尝试所有可能的设置,但我很确定每天处理 ffmpeg 的人会立即知道最佳设置。

此命令给出大约一秒的延迟和 25 FPS:

服务器:avconv -f x11grab -s 2160x1200 -r 60 -i :0.0 -f mpegts udp://192.168.0.2:1234

客户端:mplayer -benchmark udp://192.168.0.2:1234

如果我使用“rawvideo”,则 mplayer 不会拾取该流。它只会说“流不可搜索”。

答案1

avconv -f x11grab -s 640x1200 -r 60 -i :0.0 -f mpegts udp://192.168.0.2:1234

avconv -f x11grab -s 640x1200 -r 60 -i :0.0 -f mpegts udp://192.168.0.2:1235

avconv -f x11grab -s 640x1200 -r 60 -i :0.0 -f mpegts udp://192.168.0.2:1236

avconv -f x11grab -s 640x1200 -r 60 -i :0.0 -f mpegts udp://192.168.0.2:1237

MPlayer 处于基准模式,无延迟

更多细节:我发现本质上需要分割流才能使用更多的 CPU。使用“nice”来确定单个流的优先级没有任何作用。它只是以 25 fps 的速度推动 2k,使用了大约 30% 的 CPU。就好像我将其分成多个流,如上所示,我可以在每个图块上获得 60FPS,CPU 使用率为 85%。 -threads 0 to 6 选项的行为与预期不同。如果有的话,它只会使渲染速度变慢。 H264更好,网络必须是千兆。

相关内容