LINUX.ORG.RU

MJPEG чем создавать?


0

1

Пишу на Qt, есть серия JPEG файлов, тупо файлов на диске которые открывает обычный любой просмотрщик. Как затолкать их в видео-файл MJPEG в контейнер AVI или любой другой популярный?

Пробовал ffmpeg (libavformat), когда я заталкиваю туда кадры от x264 - все идеально работает, причем как в AVI так и другие контейнеры. Пробовал по аналогии затолкать JPEG файлы (от первого до последнего байта) - не работает.

Где вообще почитать об MJPEG подробнее? В чем различия, что в контейнер укладывать и т.п.? На удивление, как-то мало инфы в гугле, может потому что нет специальных различий с обычным JPEG - не уверен.

Вопрос: как затолкать картинки JPEG (по сети приходят) в видеофайл без перекодирования?

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

Ответ на: комментарий от dikiy

ок, мне надо из C++/Qt, чтобы записывать поток, т.е. нет заранее лежащих JPEG-файлов, а есть поток из JPEG картинок и их все больше

могу я при помощи mencoder их записывать и дописывать в конце файла? я буду вызывать сторонний процесс - mencoder, главное - есть ли возможность продолжить файл?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

вот чего не знаю, того не знаю. Возможно, что и можно просто втупую cat использовать и дописывать в конец.

Попробуй просто.

и грепай ман на тему -mf

Creating a Motion JPEG (MJPEG) file from all the JPEG files in the current dir:
  mencoder -mf on:w=800:h=600:fps=25 -ovc copy -o output.avi \*.jpg
dikiy ★★☆☆☆
()

нагуглил вот что:

If you were to take a bunch of jpegs, cat them together into a large, giant file, and feed it to ffmpeg, it would see it as a valid mjpeg format file. Some cameras will add an additional header to contain audio data, but it is not needed to be considered valid motion jpeg.

так что все еще проще :)

dikiy ★★☆☆☆
()

mjpeg это способ стриминга jpeg'ов и он существенно зависит от протокола передачи. Так, например, для http стриминга между кадрами вставляются специальные маркеры (например, marker-code), в content-type пишется multipart/x-mixed-replace;boundary=marker-code. Для rtp вообще полностью меняется заголовок jpeg. ffmpeg не умеет кодировать/декодировать mjpeg поток (по крайней мере полтора года назад не умел).

Reset ★★★★★
()
Ответ на: комментарий от Reset

хорошо, пусть не ffmpeg, а что угодно - мне не принципиально что именно будет создавать видеофайл на основе JPEG картинок - суть такова что они HD и перекодировать на лету увы не хватает уж «сил»

задача проста по формулировке - приходят JPEG картинки - надо их сложить так чтобы видеопроигрыватель мог их воспроизводить, например vlc или phonon внутри программы на Qt

спасибо всем отписавшимся за пример, возможно mencoder и есть решение

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от dikiy

мне не принципиально строгое следование стандартам, лишь бы видео из картинок родилось и я мог найти средство это дело воспроизвести внутри своей программы например при помощи phonon

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от AF

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

но у меня НЕТ возможности вот так просто выложить 50 тысяч JPEG файлов и вызвать команду

есть JPEG файл в памяти - чем и как их дописывать в тот или иной видео-файл?

так что не всё так просто - я не нашел примеров как это сделать, но всё еще в процессе поиска

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

есть JPEG файл в памяти - чем и как их дописывать в тот или иной видео-файл?

Не поверишь, с помощью ffmpeg или gstreamer )

Правда по первому официальной документации нету. А то что есть - показывает, как проигрывать. Так что путь один исходники ffplay.c в редактор и вперед....

Ну а по gstreamer надо не меня спрпашивать.

AF ★★★
()
Ответ на: комментарий от AF

по первому в самом деле нет документации, потому что с помощью ffmpeg я уже умею складывать H264 кадры в avi/mkv/vwm и оно играется любым проигрывателем

сделал по аналогии для JPEG файлов и увидел что так просто не работает, а примеров не найти

в связи с этим я решил что мне надо найти софт который понимает на входе те JPEG картинки что у меня по факту есть - так я решу задачу быстрее

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

и самое смешное... я пока не нашел внятного описания MJPEG, чем от обычного отличается, какие там особые заголовки и т.п.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от AF

не, спасибо, это пройденный этап, делая по аналогии с JPEG - не работает

это смешно я не могу найти внятное подробное описание MJPEG файлов и как их формировать самому имея JPEG файлы...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

по первому в самом деле нет документации, потому что с помощью ffmpeg я уже умею складывать H264 кадры в avi/mkv/vwm и оно играется любым проигрывателем

Походу самое сложное уже пройдено. Теперь последовательность действий такова:

1) инициализация FFMPEG на предмет сохранения видео пожатого кодеком MJPEG в контейнер avi/mkv или что там тебе надо

2) Если кадры уже есть в файлах, то средствами FFMPEG oткрываем каждый такой файл, читаем из него пакеты и записываем эти пакеты без пережатия сразу в avi/mkv, etc

3)Если кадры у тебя не пожаты и в памяти, то жмем с помощью кодека MJPEG и результат зпаписываем аналогично п.2

AF ★★★
()
Ответ на: комментарий от I-Love-Microsoft

это смешно я не могу найти внятное подробное описание MJPEG файлов

И не найдешь, потому что неправлиьно вопрос ставишь )

Нет никаких MJPEG файлов! Есть только кодек MJPEG, а результаты его работы складывают в контейнер. Вот и смотри документацию по контейнеру - avi, mkv, mpeg или что там у тебя

AF ★★★
()
Ответ на: комментарий от AF

так вся проблема в том что ресурсов выполнять пережатие нет

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

ffmpeg при пережатии перекодирует или просто меняет какие то поля?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

ffmpeg при пережатии перекодирует или просто меняет какие то поля?

Он может и так и так.

Я тут перечитал топик...

Насколько я понял к тебе картинки уже ввиде jpg файлов приходят? В таком случае тебе нужен п.2

2) Если кадры уже есть в файлах, то средствами FFMPEG oткрываем каждый такой файл, читаем из него пакеты и записываем эти пакеты без пережатия сразу в avi/mkv, etc

В этом случае перекодирования не будет, т к пакет содержит пожатые данные!

AF ★★★
()
Ответ на: комментарий от AF

у меня еще есть отягчающее обстоятельство - набор JPEG-ов может составлять десятки часов по 25 кадров в секунду

но самое интересное что есть непреодолимая потеря нескольких процентов кадров - в своем формате файлов я ставлю временные метки чтобы например 5 минут воспроизведения и были теми же 5-ти минутами по длительности

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

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

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

У каждого AVPacket есть pts и dts.

//Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will be presented to the user. 
int64_t 	pts

//Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed. 
int64_t 	dts

Это именно то, что тебе нужно! Поскльку кадры у тебя жмуться независимо друг от друга, то dts и pts у тебя будут совпадать.

AF ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.