各位视频编解码器爱好者们,大家好,
我目前正在开发一个小型系统,使用办公室的电脑在客厅玩游戏。我正尝试使用 ffmpeg 通过 UDP 以尽可能低的延迟传输屏幕。现在我的命令如下:
服务器端
ffmpeg -s 1920x1080 -f x11grab -i :0.0+0,0 -preset ultrafast -tune zero_latency -f mpegts udp://{CLIENT_IP}:8000
客户端
ffplay -fflags nobuffer -flags low_delay -probesize 20000 -analyzeduration 1 -strict experimental -framedrop -f mpegts udp://{SERVER_IP}:8000
虽然我的接收端视频质量很好(实际上我想使用不同的复用器因为 mpegts 有点丑),但现在我遇到了整整一秒的延迟。
奇怪的是,如果我在服务器端降低比特率,延迟保持不变。
您知道有什么方法可以减少它吗?
答案1
对于mpegts
具有最小延迟的流式传输,还有一个“秘密参数”:
`-omit_video_pes_length 0`
默认值为-omit_video_pes_length 1
,省略长度会增加一帧的延迟。
服务器端:
ffmpeg -s 1920x1080 -f x11grab -i :0.0+0,0 -preset ultrafast -tune zero_latency -f mpegts -omit_video_pes_length 1 udp://{CLIENT_IP}:8000
为了使 FFplay 获得最小的延迟,请使用-flags low_delay
,-probesize 32
并-vf setpts=0
按照说明进行操作这里。
客户端:
ffplay -fflags nobuffer -flags low_delay -probesize 32 -analyzeduration 1 -strict experimental -framedrop -f mpegts -vf setpts=0 udp://{SERVER_IP}:8000
仅当通信带宽接近满容量时,降低比特率才会影响延迟(低于某个比特率,影响可以忽略不计)。