Как через ffmpeg объединить каждый mp4 файл из папки с одним файлом вне папки?
В папке есть скажем 100 mp4 файлов и с наружи есть один mp4 файл-заставка.
Нужно к каждому файлу в конце добавить эту заставку.
Все файлы уже приведены к единым характеристиками. Поэтому надо просто склеить в цикле через ffmpeg concat.
Кто может сказать такую команду?
Concat делать способом, который вам больше нравится:
ffmpeg.org/ffmpeg-filters.html#concat - требует перекодирования, но результат обычно более гибкий и точный. Скорее всего придётся корректировать pts при помощи опции -fflags +genpts на выходе или фильтра pts.
Nextman: а как пробуете?
нужно как-то так:
ffmpeg -f concat concat.script ....
где внутри concat.script что-то вроде:
~~~ cut here ~~~
file clip.mp4
file clip_ad.mp4
~~~ cut here ~~~
файлик, есесно, нужно формировать для каждой пары, но сложного тут ничего не вижу. А можно и через stdin попытаться:
~~~ cut here ~~~
cat | ffmpeg -f concat -i - out.flv << EOF
file $clip
file $ad
EOF
~~~ cut here ~~~
(проверил - работает)
monah_tuk: у меня есть команда которую использовал для склейка всех файлов внутри папки:
ffmpeg -f concat -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
работает хорошо, но теперь задача изменилась и не могу переделать скрипт.
понимаю, что надо вынести цикл вперед и склеить элемент с заставкой. но не пойму саму команду склейки
думал как то так:
for ff in ./*.mp4; do ffmpeg -f concat -i <(echo "file '$PWD/$ff $PWD/intro.mp4'"; done) -c copy _"$ff".mp4
не так не пашет
Я вас перестал понимать. Вы сами пишите:
> В папке есть скажем 100 mp4 файлов и с наружи есть один mp4 файл-заставка.
> Нужно к каждому файлу в конце добавить эту заставку.
в результате моей команды будет 100 файлов, которые представляют собой оригинальный + заставка в конце. Вы запускать её пробовали? Судя по всему - нет. Либо вопрос у вас сформулирован в корне неверно.
Nextman:
> for ff in ./*.mp4; do ffmpeg -f concat -i <(echo "file '$PWD/$ff $PWD/intro.mp4'"; done) -c copy _"$ff".mp4
в это команде столько синтаксических ошибок, что даже разбирать невозможно. Хотите однострочник? Вот вам однострочник:
for ff in ./*.mp4; do ffmpeg -f concat -i <(printf "file '$PWD/$ff'\nfile /tmp/intro.mp4\n") -c:v copy -c:a copy `dirname $ff`/`basename $ff .mp4`_out.mp4; done