Как разобрать MJPEG HTTP Stream в C ++? - PullRequest
5 голосов
/ 26 января 2011

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 26 января 2011

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

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

Например, вывод mfpeg в 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
...
1 голос
/ 09 мая 2013

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

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

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

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

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

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

...