Подтвердить что ты не робот

Наложение анимированных изображений с прозрачностью на статическое фоновое изображение с использованием ffmpeg?

Я ищу для создания видео с помощью набора png-изображений, прозрачность которых объединена со статическим фоном.

После многократного копания кажется, что это определенно возможно с помощью библиотеки фильтров.

Мое начальное видеопроизводство без включения фона:

ffmpeg -y -qscale 1 -r 1 -b 9600 -loop -i bg.png -i frame_%d.png -s hd720 testvid.mp4

Используя -vf, я могу применить фон как оверлей:

ffmpeg -y -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [wm];[in][wm] overlay=0:0 [out]" -s hd720 testvid.mp4

Однако проблема заключается в том, что он перекрывает фон над входом. Согласно libacfilter, я могу разделить вход и воспроизвести с ним контент. Мне интересно, могу ли я как-то изменить порядок наложения?

Любая помощь очень ценится!

ОБНОВЛЕНИЕ 1:
Я пытаюсь сделать следующий фильтр, но я получаю фильм без фона:

ffmpeg -y -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [bg]; [in] split [T1], fifo, [bg] overlay=0:0, [T2] overlay=0:0 [out]; [T1] fifo [T2]" -s hd720 testvid.mp4

ОБНОВЛЕНИЕ 2:
Получил видео с использованием опции -vf. Просто пробив входную щель, она применила изображение поверх нее и наложила два разделенных канала! Наверное, не самый эффективный способ... но он сработает!

ffmpeg -y -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png, scale=1280:720:0:0 [bg]; [in] format=rgb32, split [T1], fifo, [bg] overlay=0:0, [T2] overlay=0:0 [out]; [T1] fifo [T2]" -s hd720 testvid.mp4
4b9b3361

Ответ 1

Порядок наложения контролируется порядком входов, от документов ffmpeg

[...] принимает два входа и один выход, первый вход - это "основное" видео, на которое накладывается второй вход.

Вторая команда будет выглядеть так:

ffmpeg -y -loop 1 -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [wm];[wm][in] overlay=0:0" -s hd720 testvid.mp4

В последних версиях ffmpeg новая команда -filter_complex делает этот процесс еще проще:

ffmpeg -loop 1 -i bg.png -i frame_%d.png -filter_complex overlay -shortest testvid.mp4

Полный рабочий пример:

Источник наших прозрачных входных изображений (извинения за танцы):
Dancing banana
Помещено в рамки с помощью ImageMagick:

convert dancingbanana.gif -define png:color-type=6 over.png

(Настройка png:color-type=6 (RGB-Matte) имеет решающее значение, поскольку ffmpeg не обрабатывает индексированную прозрачность правильно.) Входы называются over-0.png, over-1.png, over-2.png и т.д.

Наш фоновый рисунок (увеличенный до банана):
Happy little mountain

Используя ffmpeg version N-40511-g66337bf (a git build со вчерашнего дня), мы делаем:

ffmpeg -loop 1 -i bg.png -r 5 -i over-%d.png -filter_complex overlay -shortest out.avi

-loop включает в себя вход фонового изображения, так что у нас есть не только один кадр, решающий!
-r замедляет танцевальный банан, необязательно.
-filter_complex - это недавно добавленная функция ffmpeg, облегчающая обработку нескольких входов.
-shortest заканчивает кодирование, когда заканчивается кратчайший вход, что необходимо, поскольку петля фона означает, что этот вход никогда не закончится.

Используя немного меньше передовой сборки, ffmpeg version 0.10.2.git-d3d5e84:

ffmpeg -loop 1 -r 5 -i back.png -vf 'movie=over-%d.png [over], [in][over] overlay' -frames:v 8 out.avi

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

Конечный результат (вывод как gif для вложения):
Dancing banana with background

Ответ 2

для ссылок в будущем по состоянию на 17/02/2015, в командной строке:

ffmpeg -loop 1 -i images/background.png -i images/video_overlay%04d.png -filter_complex overlay=shortest=1 testvid.mp4

спасибо за llogan, который нашел время, чтобы ответить здесь: https://trac.ffmpeg.org/ticket/4315#comment:1