我正在一个项目中,一个客户需要从摄像机拍摄几张快照(即实际上是在拍摄短时视频,因此是一帧帧),然后将所有图像发送到服务器< / strong>,然后对这些图像进行一些处理,并将结果返回给客户端。
客户端和服务器都运行 Python3 代码。
关键是图像发送。
首先从某些背景开始,图像是* 640 * 480 jpeg *文件。 JPEG被选为默认选项,但也可以选择较低质量的编码。它们由相机顺序捕获。因此,我们大约有〜600帧要发送。帧大小约为110KiB。
客户端由Raspberry Pi 3 B +模型组成。它通过wifi将帧发送到5c服务器。服务器和客户端都位于原型版本的同一LAN中。但是就连接介质(有线或无线)和区域(LAN或城域)而言,未来的部署可能会有所不同。
我已经为此实现了几种解决方案:
在服务器和客户端上使用 Python套接字:我要么在一帧捕获后直接发送一帧,要么正在发送 >完成整个流捕获后,按顺序>所有图像。
使用 Gstreamer :我正在客户端上启动GStreamer端点,并在流式传输时将帧直接发送到服务器。我正在使用通过GStreamer支持编译的OpenCV在服务器端捕获流,然后将它们保存到磁盘。
现在,我面临的问题是,即使两个解决方案都能“正常”工作(它们完成了“最终”工作,即将数据发送到服务器并基于某些远程处理接收结果),我相信,有一种更好的方法使用Python套接字库或任何其他可用工具将大量数据发送到服务器。
所有关于此事的个人研究都使我使用Python套接字或与上下文无关(依赖于纯Python之外的其他后端)找到与我的解决方案类似的解决方案。
通过一种更好的方法,我认为:
对于1.,我对第一个解决方案进行了少许修改,以将所有捕获的帧存档并压缩到我发送到服务器的.tgz文件中。实际上,它减少了带宽使用,但同时也增加了在两端花费的时间(由于取消/压缩过程)。当数据集很大时,尤其如此。
对于2。GStreamer使我在服务器上的捕获和接收之间的延迟可以忽略不计。但是,我根本没有压缩,并且由于上述原因,我不能真正使用此库进行进一步的开发。
如何以最少的带宽使用和Python延迟将大量图像从一个客户端发送到一台服务器?
答案 0 :(得分:1)
如果要将图像作为帧传输,可以使用一些现有的应用程序,例如MJPEG-Streamer,它将来自网络摄像头界面的图像编码为JPG
,从而减小图像尺寸。但是,如果您需要使用高级编码进行更可靠的传输,则可以使用here中记录的一些Linux工具,例如FFMPEG
进行流传输。
如果要降低实现并通过代码控制整个流以进行修改,可以使用Flask
之类的基于Web的框架,并直接通过HTTP协议传输图像。您可以在here中找到一个很好的例子。
如果您不想流式传输,则可以将整个图像集转换为h264
之类的视频编码格式,然后通过字节传输网络。您可以使用opencv
来执行此操作。
还有一些用python编写的好的库,例如pyffmpeg。