![如何制定 FFmpeg 命令以零延迟流式传输到 VR 耳机?](https://linux22.com/image/96821/%E5%A6%82%E4%BD%95%E5%88%B6%E5%AE%9A%20FFmpeg%20%E5%91%BD%E4%BB%A4%E4%BB%A5%E9%9B%B6%E5%BB%B6%E8%BF%9F%E6%B5%81%E5%BC%8F%E4%BC%A0%E8%BE%93%E5%88%B0%20VR%20%E8%80%B3%E6%9C%BA%EF%BC%9F.png)
如何使用 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更好,网络必须是千兆。