Как извлечь изображения из потока Motion Jpeg IP-камеры?

Я использую GET nphMotionJpeg для получения потока Motion Jpeg с IP-камеры Panasonic. Содержание ответа описано в документе ниже.

(2) Data reception 
    "HTTP/1.0 200 OK\r\n" 
    "Content-Type: multipart/x-mixed-re place; bound ary=--myboundary..." 
    "...--myboundary.Content-type: image/jpeg..." 
    JPEG binary data No. 1 (Hexadecimal notation="FFD8...... ........................ ..FFD9") 
    "...--myboundary.Content-type: image/jpeg..." 
    JPEG binary data No. 2 (Hexadecimal notation="FFD8...... ........................ ..FFD9") 
    : 
    : 
    "...--myboundary.Content-type: image/jpeg..." 
    JPEG binary data No. N (Hexadecimal notation="FFD8...... ........................ ..FFD9") 

    * Above mentioned  Content-type: From FFD8(following image/jpeg) to "--my boundary" (just before FFD9) 
    is 1 JPEG data file. 

    (3) Image displaying/saving 
    From the data above, extract JPEG  data, and display the extracted consecutively or save it. 
    A viewer that supports the above data is required to view images. 

Проблема, с которой я сталкиваюсь при попытке извлечь данные изображений jpeg из приведенного выше содержимого ответа, заключается в том, что он не позволяет мне узнать размер каждого изображения.

Это очень сложно обработать, когда нет размера изображения.

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

Можете ли вы предложить мне простой способ сделать это?


person Levanphong7887    schedule 10.02.2012    source источник
comment
stackoverflow.com/questions/6022423/   -  person Martin Beckett    schedule 10.02.2012


Ответы (2)


Некоторые [лучшие] IP-камеры предоставляют подзаголовок Content-Length вместе с каждым видеокадром JPEG, однако этот заголовок не является обязательным, и в вашем случае это становится проблемой: у вас заранее нет длины данных JPEG.

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

К вашему сведению, некоторые старые камеры Panasonic (например, BL-C140) и Axis (например, 213 PTZ) неправильно форматируют составной ответ MIME, путая часть -- границы.

person Roman R.    schedule 12.02.2012

Используйте Gstreamer. См. мой полный пост, связанный Мартином Беккетом выше.

gst-launch souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec !  videoflip method=vertical-flip ! jpegenc !  multifilesink location=image-out-%05d.jpg
person enthusiasticgeek    schedule 29.03.2012