Как анализировать HTTP-поток MJPEG в C++?

Мне нужно получить доступ и прочитать поток http, который отправляет живые кадры MJPEG с сетевой камеры, чтобы выполнить некоторую обработку изображения opencv на изображении.

Я могу получить доступ к кадрам с камеры через VLC или просто перейдя по URL-адресу в Chrome или Firefox. Но как я могу программно получить доступ к http-серверу и разделить каждый кадр, когда сервер просто отправляет непрерывную ленту?

Данные кажутся просто отформатированными, зацикливаясь между заголовком HTTP и данными JPEG. Единственный способ, которым я могу придумать подход к этому, - это как-то отправить запрос на сервер, проанализировать данные по мере их поступления и отделить заголовок от фактических данных jpeg и, в свою очередь, передать их в opencv.

Однако это звучит ужасно запутанно, и я не совсем уверен, с чего начать. Ребята, вы знаете, есть ли какие-нибудь библиотеки или просто более простой подход, который я упускаю из виду, который мог бы упростить все это?

Большое спасибо


person jonas    schedule 26.01.2011    source источник


Ответы (2)


Для загрузки по HTTP вы можете использовать библиотеку Libcurl.

Формат AFAIK MJPEG не является стандартизированным форматом. Его фактический формат байта зависит от реализации. Но в основном просто конкатенация файла jpeg с разделителями. Если вы посмотрите на байты с помощью шестнадцатеричного редактора, вы сможете легко различить каждый файл jpeg.

Например, выходные данные mjpeg ffmpeg имеют следующую структуру:

0xff 0xd8 // start of jpeg
{ ... }   // jpeg body
0xff 0xd9 // end of jpeg
...
0xff 0xd8 // start of jpeg
{ ... }   // jpeg body
0xff 0xd9 // end of jpeg
...
person 9dan    schedule 26.01.2011

На этой странице:

http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012-05-13DisplayingStreamedMJPEGinJava.txt

Анализ потока MJPEG с помощью Java, я реализовал это с безупречными результатами на Java.

Если вы попытаетесь использовать с C++, вы обнаружите, что некоторые вещи упущены: подключение к сокету и визуализация холста, libcurl кажется хорошим вариантом для http-запроса, но по-прежнему отсутствует холст, вы можете использовать что-то вроде GLUT или Qt.

Я читал на некоторых форумах, что OpenCV может читать входной поток типа MJPEG Streamer, но, похоже, им нужна последняя версия OpenCV (компилировать OpenCV с нуля сложно).

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

person Federico Ramos    schedule 09.05.2013
comment
Я обновляю новый URL своего сайта: thistleshrub .net/www/ - person shrub34; 27.06.2015