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

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

Изображенията, които трябва да бъдат открити, се изпращат във „фазата на настройка“ (няма проблем, ако има голямо забавяне) и след това избраните видео кадри, върху които се извършва процесът на разпознаване, се изпращат с определена честота, да кажем 5 кадъра/ второ. (разбира се честотата е променлива)

Кой е най-добрият комуникационен протокол за прилагане на това? Кодът ще бъде написан на C/C++, но аз се интересувам повече от това как би изглеждал работният процес (концепцията), отколкото внедряването на кода.

HTTP достатъчен ли е за това? Какво ще кажете за RTSP или може би нещо друго? Моля, имайте предвид, че данните преминават от смартфон (където интернет връзката не е изключителна) към машина за обработка (сървър, бърза интернет връзка).

Благодаря ти!

Редактиране: Благодаря за отговорите. Всъщност търсех сравнение между съществуващите комуникационни протоколи, които могат да реализират моята специфична нужда. Както казах, не се интересувам от сложността на кода, който ще реализира "връзката". Бих искал да видя някои предимства/недостатъци между тях, спрямо моя случай на употреба. От друга страна, сървърът, извършващ разпознаването, трябва да е съвместим с комуникационния протокол (+API), реализиран от приложението, работещо на смартфона, нищо повече. Това означава, че не ме интересува как сървърът върши работата си, стига да може да разбира клиентските заявки и да връща отговор, който може да бъде разбран от приложението, което прави заявката.

Нещо, което забравих да спомена (лошото ми) е, че се интересувам от ВСИЧКИ комуникационни протоколи, които осигуряват поддръжка за прилагане на този случай на употреба.


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


Отговори (2)


Може да помислите за Websockets и тъй като използвате C++, горещо препоръчвам Websocketpp за сървър- странично изпълнение. Websocketpp има интуитивен обектно-ориентиран интерфейс, който ще ви позволи да обработвате всяко събитие, когато данните са получени, и може да обработва огромен брой едновременни клиенти. Написано е да позволява и многопоточност. В моя конкретен случай написах сървър за многонишкови видеоигри в реално време върху Websocketpp, така че съм сигурен, че работи. Websocketpp е изграден върху библиотеката Boost и причината да блести според мен е, че API е добре написан и лесен за използване. Библиотеката идва с отличен примерен код и разработчикът активно поддържа своя проект. Като използвате реализация на зряла websockets, вие няма да правите анкети, които изгарят процесора. Ще можете да обработвате неща асинхронно както от страната на клиента, така и от страната на сървъра. Websockets също е наличен с помощта на Javascript с повечето уеб браузъри, но ако не използвате уеб браузър или уеб изглед, можете да намерите свободно достъпни Websocket клиенти за различни езици.

За да използвате сървъра Websocketpp, вие регистрирате някои манипулатори за обратно извикване за общи събития.

  • on_open() се извиква всеки път, когато нов клиент направи първата си връзка със сървъра.
  • on_close() се извиква, когато клиент прекрати връзката си.
  • on_message() се извиква всеки път, когато свързан клиент изпрати данни към сървъра.

Тъй като е лесно да регистрирате манипулатори за тези функции, наистина не е нужно да се притеснявате много за протокола и можете просто да се концентрирате върху логиката, специфична за вашето приложение.

За да отговоря на вашия актуализиран въпрос, HTTP не е подходящ за поточно предаване, но се използва доста широко, защото преди се е случвало да няма добра алтернатива. Ако проучите неща за AJAX, ще откриете, че HTTP е използван с техника на „дълго запитване“. Може би ще намерите тази публикация за доста полезна: В какви ситуации би Да се ​​предпочита ли AJAX дълго/късо запитване пред HTML5 WebSockets?

Вярвам, че приетият отговор е толкова добър, че трябва просто да се обърнете към него, за да не се налага да повтарям предимствата на това защо смятам, че трябва да изберете Websockets.

person Steven    schedule 29.04.2014

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

Можете да използвате протокол от ниско ниво като TCP, който ви позволява да предавате поточно каквото искате и както искате, или можете да използвате протокол от по-високо ниво като HTTP предвид това протоколът включва механизма Chunked transfer encoding (механизъм, предназначен да ви позволява да изпращате парчета (части от файл) към сървъра за качване едно по едно).

И в двата случая можете да качвате изображения и видеоклипове на сървър. 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