Я работаю над проектом, в котором одному клиенту нужно сделать несколько снимков с камеры (т. Е. Он на самом деле снимает короткое видео, отсюда поток кадров), затем отправляет все изображения на сервер , который затем выполняет некоторую обработку этих изображений и возвращает результат клиенту.
Клиент и сервер все работают Python3 код.
Критическая часть - этоотправка одного изображения.
Сначала немного фона, изображения - это файлы * 640 * 480 jpeg *.JPEG был выбран в качестве выбора по умолчанию, но также можно выбрать более низкое качество кодирования.Они последовательно снимаются камерой.Таким образом, у нас есть приблизительно ~ 600 кадров для отправки.Размер кадра составляет около 110 КБ.
Клиент состоит из Raspberry Pi 3 модель B +.Отправляет кадры через wifi на сервер 5с.Сервер и клиент оба находятся в одной локальной сети для версии прототипа.Но будущие развертывания могут отличаться как с точки зрения среды подключения (проводной или беспроводной), так и зоны (LAN или метро).
Я реализовал несколько решений для этого:
Использование Python-сокетов на сервере и клиенте: я либо отправляю один кадр напрямую после захвата одного кадра, или я отправляю все изображения в последовательности после завершения захвата всего потока.
Использование Gstreamer : я запускаю конечную точку GStreamer на своем клиенте и напрямую отправляю кадры на сервер во время потоковой передачи.Я собираю поток на стороне сервера с помощью OpenCV, скомпилированного с поддержкой GStreamer, а затем сохраняю их на диск.
Теперь проблема, с которой я сталкиваюсь, заключается в том, что даже если оба решенияработают «хорошо» (они выполняют «окончательную» работу, то есть отправляют данные на сервер и получают результат на основе некоторой удаленной обработки), я убежден, что лучший способ для отправкибольшое количество данных на сервер, используя либо библиотеку сокетов Python, либо любые другие доступные инструменты.
Все личные исследования, проведенные по этому вопросу, привели меня к решениям, аналогичным моим, с использованием сокетов Python или быливне контекста (полагаясь на другие бэкэнды, кроме чистого Python).
Лучше, я предполагаю:
- Решение, которое экономит пропускную способность столько, скольковозможно.
- Решение, которое отправляет все данные как можно быстрее .
Для 1. Я немного изменил свое первое решение для архивирования и сжатия всех захваченных кадровв .tgzфайл, который я отправляю на сервер.Это действительно уменьшает использование полосы пропускания, но также увеличивает время, затрачиваемое на обоих концах (из-за процессов un / сжатия).Очевидно, это особенно верно, когда набор данных большой.
Для 2. GStreamer позволил мне иметь незначительную задержку между захватом и приемом на моем сервере.Однако у меня нет сжатия вообще, и по причинам, указанным выше, я не могу использовать эту библиотеку для дальнейшего развития.
Как я могу отправить большое количество изображений с одного клиента на один сервер с минимальным использованием полосы пропускания изадержка в Python?