从客户端向服务器发送大量图像的有效方法
Efficient way of sending a large number of images from client to server
我正在做一个项目,其中一个客户需要从相机拍摄多张快照(即它实际上拍摄的是短时视频,因此是帧流),然后 发送所有图像发送到服务器,然后服务器对这些图像执行一些处理,然后returns将结果发送给客户端。
客户端和服务器都是运行Python3代码。
关键是发图
先放一些背景,图片是*640*480的jpeg*文件。 JPEG 被选为默认选项,但也可以选择较低质量的编码。它们被相机按顺序拍摄。因此,我们大约有 ~600 帧 要发送。帧大小约为 110KiB。
客户端由 Raspberry Pi 3 型号 B+ 组成。它通过 wifi 将帧发送到 5c 服务器。对于原型版本,服务器和客户端都位于同一个 LAN 中。但未来的部署可能会有所不同,无论是在连接介质(有线或无线)还是区域(LAN 或城域网)方面。
我为此实施了几种解决方案:
在服务器和客户端上使用Python套接字:我要么直接发送一帧 在一帧捕获之后,或者我在整个流捕获完成后按顺序发送 所有图像 。
使用 Gstreamer:我在我的客户端上启动一个 GStreamer 端点,并在我流式传输时直接将帧发送到服务器。我使用在 GStreamer 支持下编译的 OpenCV 在服务器端捕获流,然后将它们保存到磁盘。
现在,我面临的问题是,即使两种解决方案都有效 'well'(它们完成了 'final' 工作,即将数据发送到服务器并接收基于结果的结果在某些远程处理上),我相信有 一种更好的方法 可以使用 Python 套接字库或任何其他方法将大量数据发送到服务器可用的工具。
所有关于这个问题的个人研究都让我找到了与我类似的解决方案,使用 Python 套接字,或者脱离上下文(依赖于纯 Python 以外的其他后端)。
通过更好的方式,我假设:
- 尽可能节省带宽的解决方案。
- 尽可能快地发送所有数据的解决方案。
对于 1. 我稍微修改了我的第一个解决方案,将所有捕获的帧存档并压缩到我发送到服务器的 .tgz 文件中。它确实减少了带宽使用,但也增加了两端花费的时间(由于 un/compression 进程)。当数据集很大时,显然尤其如此。
对于 2。GStreamer 允许我在我的服务器上的捕获和接收之间有一个可以忽略不计的延迟。然而,我根本没有压缩,由于上述原因,我不能真正使用这个库进行进一步开发。
如何在 Python 中以最少的带宽使用和延迟将大量图像从一台客户端发送到一台服务器?
如果您想将图像作为帧传输,您可以使用一些现有的应用程序,例如 MJPEG-Streamer which encode images from a webcam interface to JPG
which reduces the image size. But if you need a more robust transfer with advanced encoding you can use some Linux tools like FFMPEG
with streaming which is documented in here。
如果您想要较低的实现并通过您的代码控制整个流以进行修改,您可以使用基于 Web 的框架,例如 Flask
并直接使用 HTTP 协议传输您的图像。您可以在 here.
中找到一个很好的例子
如果您不想流式传输,您可以将一整套图像转换为 h264
等视频编码格式,然后将字节传输到网络。您可以使用 opencv
来执行此操作。
还有一些用 python 编写的不错的库,例如 pyffmpeg.
您可以通过网络使用 ffmpeg 重新流式传输相机,以便客户端可以双向读取。它将减少延迟。
我正在做一个项目,其中一个客户需要从相机拍摄多张快照(即它实际上拍摄的是短时视频,因此是帧流),然后 发送所有图像发送到服务器,然后服务器对这些图像执行一些处理,然后returns将结果发送给客户端。
客户端和服务器都是运行Python3代码。
关键是发图
先放一些背景,图片是*640*480的jpeg*文件。 JPEG 被选为默认选项,但也可以选择较低质量的编码。它们被相机按顺序拍摄。因此,我们大约有 ~600 帧 要发送。帧大小约为 110KiB。
客户端由 Raspberry Pi 3 型号 B+ 组成。它通过 wifi 将帧发送到 5c 服务器。对于原型版本,服务器和客户端都位于同一个 LAN 中。但未来的部署可能会有所不同,无论是在连接介质(有线或无线)还是区域(LAN 或城域网)方面。
我为此实施了几种解决方案:
在服务器和客户端上使用Python套接字:我要么直接发送一帧 在一帧捕获之后,或者我在整个流捕获完成后按顺序发送 所有图像 。
使用 Gstreamer:我在我的客户端上启动一个 GStreamer 端点,并在我流式传输时直接将帧发送到服务器。我使用在 GStreamer 支持下编译的 OpenCV 在服务器端捕获流,然后将它们保存到磁盘。
现在,我面临的问题是,即使两种解决方案都有效 'well'(它们完成了 'final' 工作,即将数据发送到服务器并接收基于结果的结果在某些远程处理上),我相信有 一种更好的方法 可以使用 Python 套接字库或任何其他方法将大量数据发送到服务器可用的工具。
所有关于这个问题的个人研究都让我找到了与我类似的解决方案,使用 Python 套接字,或者脱离上下文(依赖于纯 Python 以外的其他后端)。
通过更好的方式,我假设:
- 尽可能节省带宽的解决方案。
- 尽可能快地发送所有数据的解决方案。
对于 1. 我稍微修改了我的第一个解决方案,将所有捕获的帧存档并压缩到我发送到服务器的 .tgz 文件中。它确实减少了带宽使用,但也增加了两端花费的时间(由于 un/compression 进程)。当数据集很大时,显然尤其如此。
对于 2。GStreamer 允许我在我的服务器上的捕获和接收之间有一个可以忽略不计的延迟。然而,我根本没有压缩,由于上述原因,我不能真正使用这个库进行进一步开发。
如何在 Python 中以最少的带宽使用和延迟将大量图像从一台客户端发送到一台服务器?
如果您想将图像作为帧传输,您可以使用一些现有的应用程序,例如 MJPEG-Streamer which encode images from a webcam interface to JPG
which reduces the image size. But if you need a more robust transfer with advanced encoding you can use some Linux tools like FFMPEG
with streaming which is documented in here。
如果您想要较低的实现并通过您的代码控制整个流以进行修改,您可以使用基于 Web 的框架,例如 Flask
并直接使用 HTTP 协议传输您的图像。您可以在 here.
如果您不想流式传输,您可以将一整套图像转换为 h264
等视频编码格式,然后将字节传输到网络。您可以使用 opencv
来执行此操作。
还有一些用 python 编写的不错的库,例如 pyffmpeg.
您可以通过网络使用 ffmpeg 重新流式传输相机,以便客户端可以双向读取。它将减少延迟。