从树莓派到谷歌应用引擎上托管的NodeJS服务器的实时流媒体

wydwbb8l  于 2023-02-18  发布在  Node.js
关注(0)|答案(1)|浏览(184)

说明:

我有一个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服务器。
如果有人能提供一些信息或建议,我真的很感激。

fhg3lkii

fhg3lkii1#

如果要控制车辆,延迟是非常重要的,我认为延迟在100ms左右比较好,如果网络抖动一段时间,延迟不应该大于400ms
延迟是由任何地方引入的,从你的Raspberry PI上的编码器,到媒体服务器的传输,以及H5播放器,尤其是编码器和播放器。
最好的解决方案是使用基于UDP的协议,如WebRTC:

Raspberry PI                                   PC Chrome H5
Camera --> Encoder ---UDP--> Media Server --UDP---> WebRTC Player

所以推荐使用WebRTC来编码并将帧发送到媒体服务器和H5 WebRTC播放器。您可以通过将编码器替换为H5 WebRTC publisher来测试此解决方案,延迟大约为100ms,请参见此wiki。

Raspberry PI                                   PC Chrome H5
Camera --> WebRTC ---UDP--> Media Server --UDP---> WebRTC Player

注:WebRTC堆栈很复杂,因此您可以从H5构建到H5,测试延迟,然后将媒体服务器从内部网移动到互联网并测试延迟,接下来将H5发布器替换为Raspberry PI并测试延迟。
如果想尽快运行该解决方案,FFmpeg是一个更好的编码器,编码来自相机的帧并将其打包为RTMP包,然后通过RTMP发布到媒体服务器,最后通过H5 WebRTC播放器播放,请阅读此wiki。延迟比WebRTC编码器大,我认为可能在600ms左右,但运行演示应该是可以的。

Raspberry PI                                   PC Chrome H5
Camera --> FFmpeg ---RTMP--> Media Server --UDP---> WebRTC Player
                    or SRT

注意SRT也是实时协议,延迟约为200~ 500 ms。
请注意,您也可以在Raspberry PI上运行媒体服务器,并使用WebRTC播放器播放来自它的流,当它们在同一个WiFi中时。延迟应该是最小的,因为它是内部网传输。

相关问题