LINUX.ORG.RU

ffmpeg таймлапс из цветных и чб кадров

 


1

1

Тут собираю таймлапсы из кадров с камеры наблюдения. Проблема в том, что кадры есть 2-х типов jpg RGB и jpg Gray.

Собираю видео командой

ffmpeg  -r 24 -i "$prefix%04d.jpg" -vcodec libvpx -cpu-used 0 -crf 5 -qmin 1 -qmax 5  -threads 4 -r 24 -s 720x540 out.webm
При сборке в момент перехода между палитрами ffmpeg ругается
[buffer @ 0xf4e8e0] Changing frame properties on the fly is not supported.  
При загрузке видео на тытрубу в этом месте происходит затык.

Собственно как обойти проблему и собрать нормальный ролик из чб и цветных картинок

★★★

Последнее исправление: kombrig (всего исправлений: 1)

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

t184256 ★★★★★
()

я не специалист, но попробовал бы сконвертить всё в 24-битный .png и их бы уже загнал в ffmpeg

anonymous
()
Ответ на: комментарий от t184256

Собственно как обойти проблему и собрать нормальный ролик из чб и цветных картинок

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

Здесь засада в том, что делается это на довольно слабеньком железе (атом) он кодирует видюшку 6 минут. А если добавить еще конвертацию...

kombrig ★★★
() автор топика
Последнее исправление: kombrig (всего исправлений: 1)
Ответ на: комментарий от kombrig

В принципе перегнать в png работает, но увеличивает время обработки на 3 мин 40 сек.

Так что если есть способ загнать в 1 ролик и чб и цвет без доп. обработки, было бы неплохо...

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

Попробовал я поковыряться с фильтрами, scale и format результата не дали. С GStreamer похожая беда. По выводу strace видно, что в момент смены цветности рабочая нить вообще завершается, а вывод пустой.

Возможно, что-то получится, если читать файлы отдельно, прогонять через ImageMagick, выплёвывать сырые данные в stdout, а в ffmpeg читать из stdin. Но что-то сходу я такой комбайн не осилил собрать.

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

Да и работать такой костыль, не сильно быстрее будет чем последовательная конвертация и кодирование.

Буду тогда сразу наверное при захвате кадра в png конвертать...

kombrig ★★★
() автор топика
Последнее исправление: kombrig (всего исправлений: 2)
Ответ на: комментарий от i-rinat

Я дергаю превьюшку генерируемую камерой. Это проще чем дергать из rtsp

kombrig ★★★
() автор топика

Попробуй добавить -filter:v format=pix_fmts=yuv420p в середину

Krieger_Od ★★
()

ffmpeg пытается еще звук добавить. Надо ему явно указать "-an".

ffmpeg  -r 24 -i "$prefix%04d.jpg" -vcodec libvpx -cpu-used 0 -crf 5 -qmin 1 -qmax 5  -threads 4 -r 24 -s 720x540 -an out.webm

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

Ну и добавит пустую дорожку. На размер это почти ни как не повлияет. Проблема именно при переходе между палитрами.

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

Проверил. При переходе чб-цвет и наоборот идет затык.

kombrig ★★★
() автор топика

Можешь попробовать применить мою поделку (sleid0r), задумывалось не для этого, но использовать можно:

sleid0r -a -d 1 -r 1 -t 0 -o - -g 720x540 $prefix*.jpg | ffmpeg -f rawvideo -video_size 720x540 -pix_fmt rgba -r 24 -i pipe: -vcodec libvpx -cpu-used 0 -crf 5 -qmin 1 -qmax 5  -threads 4 out.webm
Как-то так.

Сайт сейчас не работает, но пакеты доступны здесь: http://download.opensuse.org/repositories/home:/cdslow:/sleid0r/

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

Нда. Не подумавши я сказал.

Можно собрать видео из изображений с разным форматом основываясь на двух дополнительных допущениях: 1) изображения с разным форматом различаются по имени файла, например, цветные - «rgb*.jpg», а черно-белые - «gray*.jpg»; 2) время изменения файлов установлены корректно, т. е. по нему можно выстроить последовательность кадров. Если это так, то

Читаем раздельно в два потока цветные и черно-белые изображения, устанавливаем время кадра по времени модификации файла -ts_from_file:

ffmpeg \
    -pattern_type glob -ts_from_file -i 'rgb*.jpg' \
    -pattern_type glob -ts_from_file -i 'gray*.jpg' \
Приводим два потока к одному формату фильтром format, сливаем потоки в один фильтром interleave:
    -filter_complex '
        [0] format=pix_fmts=yuv420p [a];
        [1] format=pix_fmts=yuv420p [b];
        [a][b] interleave' \
Т.к. время модификации файла будет плавать, то время кадров нужно выкинуть и заново переписать, чтобы получилась нужная постоянная частота кадров:
    -vsync drop -r 25 ... output.mkv

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

Время перехода в принципе величина вычисляемая, но точно определить время перехода неыозможно, т.к. решение принимает камера.

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

Ты имеешь в виду, что не можешь определить какой файл с цветным, а какой с черно-белым изображением? Тогда предварительно пройдись по ним ffprobe: последняя строка результата вида «Stream #0:0: Video: .....» для файлов с одинаковым форматом будет также одинаковой. Переименуй файлы исходя из этого.

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

Цветность можно exiftool ом цеплять. Вопрос в том что это по времени эти все колдунства не дадут существенного уменьшения по сравнению с конвертом в 24 бита и сборкой в лоб

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