传统媒体播放器如VLC、FFmpeg和在某种程度上的MPlayer存在的问题是它们会尝试以一致的帧速率播放,这需要一些缓冲,这会影响延迟目标。另一种选择是尽可能快地呈现传入的视频,不关心其他任何东西。
@genpfault和我制定了一种自定义UDP协议,旨在用于飞行遥控车和四轴飞行器。该协议以低延迟为目标,但牺牲了几乎所有其他因素(分辨率、比特率、数据包速率、压缩效率)。在较小的分辨率下,我们将其运行在115200波特率的UART和XBEE上,但是在这些限制下的视频并没有像我们希望的那样有用。今天,我正在测试320x240配置,运行在笔记本电脑上(Intel i5-2540M),因为我已经没有原始设置。
您需要计划好您的延迟预算,以下是我花费预算的地方:
Acquisition - 我们选择了125FPS的PS3 Eye摄像头。因此,我们的延迟最多只有8毫秒左右。应避免使用“更智能”的摄像头,在设备上进行压缩(无论是h264还是MJPEG)。此外,如果您的摄像头具有任何自动曝光时间控制功能,则需要禁用它以锁定最快的帧速率,或提供充足的照明(今天,我的内置网络摄像头仅以8 FPS运行,因为自动曝光)。
Conversion - 如果可能,请让摄像头以您可以直接压缩的格式发出帧(通常是YUV格式,Eye本地支持)。然后您可以跳过此步骤,但我在这里花费了0.1mS。
Encoding - 我们使用了一个特别调整的H.264编码器。它需要约2.5mS,并且不需要缓冲未来的帧,但代价是压缩比。
Transport - 我们使用WiFi上的UDP,当没有其他无线电干扰时,延迟小于5mS。
Decoding - 这基本上受接收器CPU的限制。编码器可以通过发送可多线程解码的工作来帮助。这通常比编码更快。今天大约需要1.5mS。
Conversion - 您的解码器可能会为您执行此步骤,但通常编码器/解码器使用YUV,而显示器使用RGB,因此必须在它们之间进行转换。在我的笔记本电脑上需要0.1mS。
Display - 没有VSYNC,60 FPS的显示器延迟高达约17mS,加上一些LCD延迟,可能是6ms?这实际上取决于显示器,而我不确定这台笔记本电脑使用哪种面板。
The total comes to: 40.2mS.
编码:
当时,X264是我们能找到的最好的H264-AnnexB编码器。我们必须控制比特率、片段最大大小、vbv-bufsize、vbv-maxrate。从“superfast”和“zerolatency”的默认值开始,这将禁用B帧。
此外,帧内刷新是必须的!有效地允许将正常的“I”帧分割并与以下P帧混合。如果没有这个功能,你会在比特率需求中有“气泡”,这些“气泡”会暂时堵塞你的传输,增加延迟。
编码-传输规划:
编码器被调整为生成UDP大小的H264 NALU。这样,当一个UDP包丢失时,整个H264 NALU就会丢失,我们不必重新同步,解码器只是一种...打嗝...并继续进行一些图形损坏。
最终结果320x240
![enter image description here](https://istack.dev59.com/kHfk7.webp)
我用手机对着摄像头对准我的笔记本电脑进行测量,但速度比我能够可靠地测量的速度要快得多。压缩比为320x240x2B = 150kB/frame,压缩后每帧仅留下3kB左右。