2011-01-26 1 views
5

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

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

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

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

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

ответ

5

Для 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 
... 
+0

https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure – user1742529

1

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

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 с нуля, это сложно).

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

+0

Я обновляю свой новый URL-адрес сайта http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012- 05-13DisplayingStreamedMJPEGinJava.txt – shrub34