说明:
我有一个Raspberry PI在控制一辆小型车辆,它附带了一个RealSense摄像头,我需要做的是从摄像头发送一个直播流到托管在Google App Engine上的HTML页面/NodeJS服务器上,这样用户就可以在自己的页面上看到流,流会被用来手动控制车辆,所以低延迟非常重要。
我尝试的:
1.我目前的解决方案只是一个简单的套接字连接使用Socket.IO,我通过套接字发送一个帧,解码它,并显示在页面中。问题是,这种方法是极其缓慢的,从我的理解不是一个很好的方式流到远程客户端,这就是为什么我需要找到一个不同的方式。
1.我尝试使用uv 4l,当我运行uv4l --driver uvc --device-id "realsense camera id"
行时,它说相机被识别,但随后立即停止,没有任何错误。当我尝试用我的IP打开流并单击“调用”时,我得到错误“无效的输入设备”。无法找到此问题的任何解决方案。
1.我还考虑过使用webRTC,我尝试遵循以下示例(这是我发现的最接近我需要的示例):https://dev.to/whitphx/python-webrtc-basics-with-aiortc-48id,但它使用Python服务器,而我想使用我的GAE/NodeJS服务器,我正在努力弄清楚如何将此代码转换为使用Python客户端和NodeJS服务器。
如果有人能提供一些信息或建议,我真的很感激。
1条答案
按热度按时间fhg3lkii1#
如果要控制车辆,延迟是非常重要的,我认为延迟在
100ms
左右比较好,如果网络抖动一段时间,延迟不应该大于400ms
。延迟是由任何地方引入的,从你的Raspberry PI上的编码器,到媒体服务器的传输,以及H5播放器,尤其是编码器和播放器。
最好的解决方案是使用基于UDP的协议,如WebRTC:
所以推荐使用WebRTC来编码并将帧发送到媒体服务器和H5 WebRTC播放器。您可以通过将编码器替换为H5 WebRTC publisher来测试此解决方案,延迟大约为
100ms
,请参见此wiki。注:WebRTC堆栈很复杂,因此您可以从H5构建到H5,测试延迟,然后将媒体服务器从内部网移动到互联网并测试延迟,接下来将H5发布器替换为Raspberry PI并测试延迟。
如果想尽快运行该解决方案,FFmpeg是一个更好的编码器,编码来自相机的帧并将其打包为RTMP包,然后通过RTMP发布到媒体服务器,最后通过H5 WebRTC播放器播放,请阅读此wiki。延迟比WebRTC编码器大,我认为可能在
600ms
左右,但运行演示应该是可以的。注意SRT也是实时协议,延迟约为200~ 500 ms。
请注意,您也可以在Raspberry PI上运行媒体服务器,并使用WebRTC播放器播放来自它的流,当它们在同一个WiFi中时。延迟应该是最小的,因为它是内部网传输。