清除JavaScript的Websocket缓冲区

5
我正在尝试编写JavaScript代码,使用Websocket接收mjpeg视频流。客户端可以选择要播放的视频文件。
服务器通过以下JSON格式以图像形式逐个发送mjpeg视频: {"image": "base64_image"}
当客户端尝试选择不同的视频时,问题出现了。更换新视频需要超过2分钟时间(尽管服务器和客户端位于不同的国家)。
我知道会有延迟,但问题在于:
越久以前打开的视频文件,下一个视频文件就显示得越慢。
我猜测是数据在缓冲区中排队。所以我的问题是:
如何在JavaScript中清空该套接字的缓冲区?
如果不是缓冲区的问题,有什么想法吗?
1个回答

0

如果没有任何示例代码,最有可能的问题是您的WebSocket客户端受到来自服务器的大量数据流的影响。

很可能您可以通过让WebSocket客户端在准备好处理下一帧时轮询下一帧来进行调整。这样做的好处是,您可以停止轮询资产X的帧并开始轮询资产Y的帧。

当然,这假设问题是客户端方面的...如果是您的服务器正在加载整个视频等,并且无法“放手”切换到其他视频,则这是服务器上的不同问题。

话虽如此,这不是WebSocket的非常好的用例...它们非常适合小数据包...这只是一个实验吗?


1
那样会更慢,来回发送会增加延迟。现在,我正在尝试使用OpenCV从服务器进行图像处理,并将处理后的图像发送到客户端。除了WebSocket,您有什么建议可以完成这项工作吗? - A-letubby
@A-letubby - 我目前运行一个使用“轮询”机制的websocket(ws)应用程序,我认为如果你进行简单的测试,你会发现客户端发送的“ACK”或“POLL”消息非常快,因为连接已经打开。如果你在标准HTTP上进行轮询,那么是很慢的,因为你需要不断地打开和关闭连接。一般来说,ws不适合发送大型图像/数据包,最好重新构思并通过正常通道(XHR)将文件的URL发送到ws下,让浏览器加载图像。 - Nick Sharp
@NickSharp 你好,我正在使用OpenCV和Web-Sockets做类似的事情。你解决了如何清除或设置缓冲区空间的问题吗? - Andrew Simpson
@AndrewSimpson - 我不确定是否实际上有缓冲空间。我的建议仍然是实现某种形式的轮询,即使只是每100帧向服务器发送“仍在听”的信息。在OP的情况下,他似乎只是在自己内部造成了洪水。 - Nick Sharp
@AndrewSimpson - 另外,Websockets并不是最适合获取资源的方式。如果需要,保持套接字通信,并使用更传统的HTTP GET来获取原始资产或处理后的文件。 - Nick Sharp
感谢您的回复。在使用套接字之前,我使用了HTTP GET,并且与套接字相比性能较差。此外,自动拉取字节数组会将其转换为base64,而我更喜欢在客户端上进行base64转换。我正在考虑每30秒向服务器发送来自客户端的脉冲问候,以检查客户端是否正在接收。 - Andrew Simpson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接