MJPEG видео с IP-камеры слишком быстро - PullRequest
2 голосов
/ 25 января 2012

Я просто пытаюсь прочитать видеопоток с IP-камеры (Basler BIP-1280c). Поток, который я хочу получить, сохраняется в буфере на камере, имеет длину 40 секунд и декодируется в MJPEG.

Теперь, если я получаю доступ к потоку через веб-браузер, он показывает мне 40 секунд без проблем. Но на самом деле мне нужно приложение, которое способно загружать и сохранять поток самостоятельно.

Доступ к камере осуществляется через http, поэтому я использую libcurl для доступа к ней. Это отлично работает, и я также могу скачать поток без каких-либо проблем. Я решил сохранить данные потока в файл * .avi (надеюсь, это правильно…?).

Но теперь проблема: я могу открыть видео (пробовал с Totem Video Player и VLC), а также просмотреть все, что было записано - НО это слишком быстро. Все видео длится около 5 секунд (вместо 40). Есть ли в MJPEG что-нибудь в заголовке, куда помещать информацию, такую ​​как общая длина видео или fps? Я имею в виду, что для видеоплееров не хватает какой-то информации, чтобы они проигрывали ее быстро?

Обновление:

Как и предлагалось в ответах, я открыл файл с помощью шестнадцатеричного редактора, и обнаружил, что это:

--myboundary..Content-Type: image/jpeg..Content-Length: 39050.........*Exif..II*...............V...........................2...................0210................FrameNr=000398732 6.AOI=(0800x0720)@(0240,0060)/(1280x0720).Motion=00000 (no) [00000 | 00000 | 00000 | 00000 | 00000].Alarm=0000 (no) .IO =000.RtTrigger=0...Basler..BIP2-1280c..1970:01:05 23:08:10.8 98286......JFIF...... ............................ ....&"((

Этот заголовок повторяется во всем файле (за ним следует много байтов двоичных данных). Это на самом деле нормально, так как я прочитал в руководстве к камере, что все изображения MJPEG получают этот заголовок.

Более интересны следующие элементы: JFIF в последней строке. Как и предлагалось в ответах, возможно, это индикатор формата файла. Но afaik JFIF - это один формат изображения, такой же как jpg. Так может ли это означать, что весь видеофайл представляет собой просто несколько «безмозглых» картинок? И мой игрок просто предполагает, что он должен показывать эти картинки один за другим, не зная о частоте кадров?

Ответы [ 3 ]

6 голосов
/ 25 января 2012

Нет ни одного формата для использования с MJPEG. Из Википедии:

[...] нет документа, определяющего один точный формат, который общепризнанный как полная спецификация «Motion JPEG» для использования во всех контекстах.

Форматы различаются в зависимости от поставщика. Мой совет - внимательно изучить загруженный файл. Проверьте, действительно ли это действительно контейнер AVI. (Некоторые камеры могут отправлять кадры, помещенные в контейнер MIME).

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

Вы также можете найти этот проект полезным: http://mjpeg.sourceforge.net/

Edit:

Согласно вашим образцам данных ваша камера отправляет кадры, упакованные в контейнер MIME. (Первая строка - это граница, затем заголовки, пока вы не встретите пустую строку, затем данные файла будут проданы, затем будет граница и т. Д.).

Это файлы JPEG в соответствии с заголовком: image/jpeg. JFIF - это стандартный формат файла для хранения данных JPEG.

Я рекомендую вам:

  1. Извлеките содержимое файла в несколько файлов JPEG (например, с munpack ), затем
  2. используйте ffmpeg или mplayer для создания файла фильма из серии jpegs.

Таким образом, вы также можете указать желаемую частоту кадров.

Это может усложнить ситуацию, если камера динамически изменяет AOI (интересующую область), что означает, что она может отправлять только меньшую часть изображения, где произошли изменения. Но вы должны сначала проверить, работает ли простой подход.

1 голос
/ 30 января 2012

--myboundary указывает на то, что поток представляет собой обычный M-JPEG, передаваемый в виде составного контента по HTTP.Не существует хорошо известного формата файла, который может хранить этот поток «как есть» и быть воспроизводимым (то есть, если вы переименуете его в AVI, он не должен воспроизводиться).

Сам формат представляет собой последовательность (boundary, subheader, JPEG image), (boundary, subheader, JPEG image), ... и т. Д. Поток не имеет отметок времени, поэтому скорость воспроизведения полностью зависит от проигрывателя.

1 голос
/ 25 января 2012

в системах un * x (linux, osx, ...), вы можете использовать инструмент file cmdline, чтобы сделать (обычно хорошее) предположение о формате файла.

...