Передача изображений (дескрипторов изображений) через Интернет

Мне нужно отправить изображения или дескрипторы изображений с клиента (смартфона) на сервер (машину обработки). Сервер пытается распознать изображения/функции в видеопотоке и отправляет обратно идентификаторы обнаруженных +, возможно, некоторые дополнительные данные. Обычно процесс распознавания длится не более нескольких секунд (учитывая большое количество распознаваемых изображений). В идеале сервер обработки отвечает в течение миллисекунд.

Изображения, которые необходимо обнаружить, отправляются на «этапе настройки» (нет проблем, если есть большая задержка), а затем образцы видеокадров, на которых выполняется процесс распознавания, отправляются с определенной частотой, скажем, 5 кадров/ второй. (конечно, частота варьируется)

Каков наилучший протокол связи для реализации этого? Код будет написан на C/C++, но меня больше интересует, как будет выглядеть рабочий процесс (концепция), а не реализация кода.

Достаточно ли для этого HTTP? Как насчет RTSP или, может быть, что-то еще? Пожалуйста, имейте в виду, что данные поступают со смартфона (где интернет-соединение не является исключительным) на обрабатывающую машину (сервер, быстрое интернет-соединение).

Благодарю вас!

Редактировать: Спасибо за ваши ответы. На самом деле я искал сравнение между существующими протоколами связи, которые могут реализовать мою конкретную потребность. Как я уже сказал, меня не интересует сложность кода, который бы реализовывал "связь". Мне бы хотелось увидеть некоторые преимущества/недостатки между ними по сравнению с моим вариантом использования. С другой стороны, сервер, выполняющий распознавание, должен соответствовать протоколу связи (+API), реализуемому приложением, работающим на смартфоне, и не более того. Это означает, что мне все равно, как сервер выполняет свою работу, пока он способен понимать запросы клиентов и возвращать ответ, который может понять приложение, выполняющее запрос.

Кое-что, что я забыл упомянуть (мое плохое), это то, что меня интересуют ВСЕ протоколы связи, которые обеспечивают поддержку для реализации этого варианта использования.


person Traian    schedule 20.04.2014    source источник


Ответы (2)


Возможно, вы захотите рассмотреть веб-сокеты, и, поскольку вы используете C++, я настоятельно рекомендую Websocketpp для сервера- боковая реализация. Websocketpp имеет интуитивно понятный объектно-ориентированный интерфейс, который позволит вам обрабатывать каждое событие при получении данных и может обрабатывать огромное количество одновременных клиентов. Он также написан для обеспечения многопоточности. В моем конкретном случае я написал многопоточный игровой сервер реального времени поверх Websocketpp, так что я уверен, что он работает. Websocketpp построен на основе библиотеки Boost, и причина его успеха, на мой взгляд, заключается в том, что API хорошо написан и прост в использовании. Библиотека поставляется с отличным примером кода, и разработчик активно поддерживает свой проект. Используя зрелую реализацию веб-сокетов, вы не будете выполнять никаких опросов, которые сжигают ЦП. Вы сможете обрабатывать вещи асинхронно как на стороне клиента, так и на стороне сервера. Веб-сокеты также изначально доступны с использованием Javascript в большинстве веб-браузеров, но если вы не используете веб-браузер или веб-просмотр, вы можете найти свободно доступные клиенты веб-сокетов для разных языков.

Чтобы использовать сервер Websocketpp, вы регистрируете некоторые обработчики обратных вызовов для общих событий.

  • on_open() вызывается всякий раз, когда новый клиент впервые подключается к серверу.
  • on_close() вызывается, когда клиент разрывает соединение.
  • on_message() вызывается всякий раз, когда подключенный клиент отправляет данные на сервер.

Поскольку зарегистрировать обработчики для этих функций несложно, вам не нужно сильно беспокоиться о протоколе, и вы можете просто сосредоточиться на логике своего приложения.

Чтобы ответить на ваш обновленный вопрос, HTTP не очень подходит для потоковой передачи, но использовался довольно широко, потому что раньше не было хорошей альтернативы. Если вы исследуете материал AJAX, вы обнаружите, что HTTP использовался с методом «длинного опроса». Возможно, вы найдете этот пост весьма полезным: В каких ситуациях Длинный/короткий опрос AJAX предпочтительнее веб-сокетов HTML5?

Я считаю, что принятый ответ настолько хорош, что вам следует просто обратиться к нему, чтобы мне не приходилось повторять достоинства того, почему я думаю, что вам следует выбрать веб-сокеты.

person Steven    schedule 29.04.2014

RTSP (протокол потоковой передачи в реальном времени) — это не то, что вам нужно, потому что он был разработан с совсем другой идеей. По сути, вам нужен протокол, позволяющий загружать файлы (или их части).

Вы можете использовать протокол низкого уровня, такой как TCP, который позволяет вам передавать все, что вы хотите и как вы хотите, или вы можете использовать протокол более высокого уровня, такой как HTTP, учитывая это. Протокол включает в себя механизм кодирования фрагментированной передачи (механизм, разработанный для того, чтобы вы могли отправлять фрагменты (фрагменты файла) на сервер загрузки один за другим).

В обоих случаях вы можете загружать изображения и видео на сервер. HTTP проще, потому что это простой протокол, и вы можете найти множество примеров кода для загрузки файлов, действительно, например, когда вы загружаете файлы на YouTube, вы используете HTTP (в данном случае без фрагментации). В любом случае, я рекомендую вам использовать механизм кодирования фрагментированной передачи, поскольку он позволяет возобновить загрузку (после паузы или отключения от Интернета).

Еще одна веская причина использовать HTTP (через TCP) заключается в том, что код на стороне сервера будет проще, учитывая, что все веб-серверы могут помочь вам сосредоточиться на реальной проблеме, убрав ненужные детали.

Таким образом, HTTP идеально подходит для ваших требований, однако вы должны принять во внимание, что ни один протокол не имеет встроенного способа регулирования. Это означает, что если вы хотите отправить 5 кадров в секунду, вам нужно будет написать код для управления этим.

Однако, если вам требуется более высокий уровень контроля, вы можете использовать TCP напрямую.

Использование TCP (это псевдокод)

socket = new Socket(SERVER_IP, PORT, TCP_PROTOCOL);
nextFrame = 0;
while(videoManager.IsThereFrame(nextFrame)){
   buffer = videoManager.ReadFrameAsByteArray(nextFrame++);
   if(AmISendingTooFast) waitForAWhile()

   socket.Write(buffer);
   if(error) repeat or save the nextFrame to try again later.
}
socket.Close();

Заключение

HTTP идеально подходит для того, что вам нужно, используйте его. Если ваши требования более сложны и вы хотите иметь дополнительный полный контроль, используйте TCP, но помните, что это будет сложнее, и у вас не будет веб-сервера, который мог бы вам помочь.

Я надеюсь, это поможет вам.

person lontivero    schedule 28.04.2014