Пользовательский писатель файлов avi / MP4

Я пишу некоторые видеофайлы под Windows с камеры.
Мне нужны данные в неизменном виде, а не в «несжатом» формате MP4, т.е. нет YUV, нет интерполяции цвета - только необработанный поток байтов сенсора камеры.

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

Я мог бы добавить собственный заголовок, но даже если фактические видеоданные не читаются ничем, кроме моего приложения, использование файла AVI, по крайней мере, даст мне относительно стандартный заголовок для хранения всех параметров камеры, а также означает, что разрешение, длина и т. Д. появиться в проводнике.

Есть ли простой способ сгенерировать верхний / нижний колонтитул AVI без отправки всех данных через директшоу или vfw? Данные поступают со скоростью> 250 МБ / с, и я не могу потерять кадры, поэтому у меня нет времени делать что-то большее, чем выгружать каждый кадр на диск.

edit: Возможно, MP4 было бы лучше, у меня есть много метаданных о конфигурации камеры, которых нет в стандарте AVI


person Martin Beckett    schedule 21.10.2010    source источник
comment
почему вы хотите записывать заголовки AVI в байтовый поток камеры? Байтовый поток не может иметь декодируемый видеоформат. Я бы посоветовал временно написать собственные заголовки и позже обработать поток, чтобы он стал AVI.   -  person arbithero    schedule 22.10.2010
comment
В моем собственном заголовке должна быть сохранена ширина / высота / частота кадров / цвет - точно так же, как в avi. Если бы я использовал avi, тогда проводник Windows мог бы хотя бы отображать эти вещи - зачем изобретать другой формат файла?   -  person Martin Beckett    schedule 22.10.2010


Ответы (4)


Итак, выяснив, какие «разумные» заголовки AVI будут для вашего потока (например, если вы используете собственный кодек fourcc, ни одно приложение, вероятно, не сможет делать с ним полезные вещи - так зачем возиться с AVI?), Вы могли бы просто напишите предварительно созданный заголовок RIFF-AVI в начале вашего файла. Определить значения несложно.

Затем каждый кадр должен быть заключен в отдельный блок RIFF (4-байтовый тип: «00db» + 4-байтовая длина + ваши данные). После этого вам нужно исправить num_frames и некоторые поля длины в заголовке. А для файлов размером> 2 ГБ не забудьте о расширении OpenDML для заголовка.

person smilingthax    schedule 21.10.2010
comment
Не знал о лимите AVI в 2 Гб, я достиг его за ‹9 секунд! Похоже, мне нужно использовать MP4 для всей дополнительной информации заголовка. Но пока я просто напишу отдельный текстовый файл для информации заголовка. - person Martin Beckett; 22.10.2010
comment
Вы также можете написать собственный фрагмент риффа с вашим собственным типом для дополнительных заголовков. Для MP4 / QT вы должны написать таблицу с позициями файлов для каждого кадра в дополнение к вашему потоку данных в заголовок (который может быть нижним колонтитулом). Да, и я забыл, что куски RIFF должны быть дополнены для выравнивания по 2 байта. - person smilingthax; 22.10.2010

Мартин, поскольку вы хорошо разбираетесь в OpenCV, не могли бы вы просто использовать cvCreateVideoWriter() для создания несжатого .avi?

CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1)

Что касается параметра foucc, в документации указано:

В Win32, если при использовании имени файла avi передается 0, создается средство записи видео, которое создает несжатый файл avi.

person karlphillip    schedule 01.04.2011
comment
Видео писатель opencv2.2 работает только с 24-битными цветными изображениями. Я только что отправил кучу патчей, позволяющих читать / писать 8/16-битную шкалу серого fourcc = Y800, Y160, но даже с ffmpeg это медленно. Но теперь он поддерживает формат openDML, так что ›2 ГБ. Теперь я смотрю, как вызвать ffmpeg, чтобы просто обработать часть заголовка и самому выполнить потоковую передачу. - person Martin Beckett; 02.04.2011
comment
@karlphilip - только что получил электронное письмо от opencv, они включили патчи, поэтому теперь он может читать / записывать несжатые 8-битные данные. - person Martin Beckett; 24.06.2011

Похоже, вы действительно могли бы извлечь выгоду из использования opencv, он, вероятно, мог бы справиться со многими из этого хорошо для вас. Посмотрите, подходит ли он вашим потребностям: http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html#videocapture

person Robert Massaioli    schedule 21.10.2010

Вы можете использовать OpenCV для чтения и записи avi-файла.
см. http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html

Обратите внимание, что OpenCV также можно использовать для захвата изображений с камеры.

person log0    schedule 21.10.2010
comment
Opencv использует vfw как для доступа к камере, так и к файлам - он отлично подходит для чтения изображений VGA с веб-камеры и записи несжатого AVI - но он не может обрабатывать чтение с камеры 4K со скоростью 60 кадров в секунду! - person Martin Beckett; 22.10.2010