Я просто хочу зациклить видео mp4 с ffmpeg и сохранить текущие настройки и кодек.
Например, если input.mp4 имеет длину 0:10, и я хотел бы зациклить его 4 раза, чтобы output.mp4 был длиной 0:40, как я могу изменить следующую командную строку, чтобы сделать это?
ffmpeg -i input.mp4 -c copy output.mp4
Я пытался...
ffmpeg -loop 4 -i input.mp4 -c copy output.mp4
... но я получаю сообщение об ошибке "Option loop not found."
Ответы:
Concat demuxer
Это позволяет зациклить вход без необходимости перекодирования.
Сделайте текстовый файл. Содержимое примера текстового файла повторить 4 раза.
Затем запустите
ffmpeg
:Для пользователей Linux
Этот пример такой же, как и выше, но вам не нужно делать вручную
list.txt
:С наиболее часто используемыми современными оболочками вы можете даже полностью избежать создания
list.txt
файла. Например, с помощью bash:Также см:
контурный фильтр
Пример использования цикла цикла 4 раза, каждый цикл равен 75 кадрам, каждый цикл пропускает первые 25 кадров ввода:
loop=3:75:25
loop=3
будет цикл 4 раза.-1
.ffmpeg -h filter=loop
.фильтр фильма
Фильтр фильм имеет вариант цикла. Смотрите ответ ниже Монах Тук. Фильтрация требует перекодирования. Для аудио используйте фильтр amovie.
-stream_loop
вариантСмотрите ответ ниже Thingy и ответ Gyan.
Обратите внимание, что этот параметр был ошибочным (см. Отчеты об ошибках # 5719 , # 6121 и # 7043 ), поэтому он может не работать для старых сборок (что-либо старше, чем версия 201-27 06-27, включая ветку релиза FFmpeg 4.0.x). Для пользователей старых сборок, как упомянуто mulvya в билете # 6121, одним из обходных путей является сначала повторное мультиплексирование в MKV или TS, а затем использование
-stream_loop
в следующей команде.-loop
вариантЭта
-loop
опция специфична для демультиплексора файлов изображений и мультиплексора gif , поэтому ее нельзя использовать для обычных видеофайлов, но ее можно использовать для бесконечного зацикливания серии входных изображений. Этот пример будет повторяться снова и снова, но-t 30
будет ограничивать продолжительность вывода до 30 секунд:Или зациклить вывод GIF:
источник
> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
-stream_loop
разделе указывает на тот же билет, что и первый ...По крайней мере , на FFmpeg 2.8.x (но старичок должен тоже работает) , вы можете использовать в
lavfi
качестве входного формата и сложный фильтр графика с использованиемmovie
иsetpts
фильтров в качестве аргумента для-i
опции.Следующая команда выполняет эту работу за вас:
Нулевые
loop=
аргументы означают бесконечный цикл. Значения с большим нулем устанавливают количество повторений.setpts
фильтры, необходимые для настройки PTS для второго и последующих повторов, в противном случае большинство выходных мультиплексоров выйдет из строя с немонотонным увеличением PTS: цикл не вызывает PTS.Обратите внимание, что использование фильтров, предполагающих, что обход кадров без декодирования / кодирования невозможен: по конструкции фильтры имеют дело только с декодированными кадрами.
В FFmpeg 2.8.2
-stream_loop
введена новая опция ввода. Во-первых, он выглядит более простым и позволяет копировать содержимое без перекодирования:Но это не пересчитывает PTS и выходной файл неверен. Если вы добавляете фильтр для исправления PTS (см.
setpts
), Вы также должны удалить его-c copy
. Только битовые фильтры могут работать с закодированными пакетами, но нет никаких фильтров битовых потоков для исправления PTS (см .: https://ffmpeg.org/ffmpeg-bitstream-filters.html ).В любом случае ffmpeg на втором проходе завершается с ошибкой:
Известный обходной путь для меня : использовать контейнер для входного файла без ограничений PTS (потоковый контейнер). Один из них, известный мне, это MPEG-TS. Итак, вы можете просто конвертировать файл MP4 в MPEG-TS:
И используйте следующую команду для создания файла бесконечности:
(Фильтры битового потока следует использовать только при необходимости, на моих примерах это требуется)
FFmpeg> = 2.8.2 требуется в этом случае.
источник
-c copy
. Ответ исправлен.В ffmpeg 2.8.4 следующая команда создает output.mp4, который является повторяющейся копией input.mp4 до тех пор, пока процесс ffmpeg не будет остановлен:
Эта команда не завершится сама по себе, и выходной файл будет расти бесконечно.
источник
Q: "... как я могу изменить следующую командную строку, чтобы сделать это? Ffmpeg -i input.mp4 -c copy output.mp4"?
О: Простой метод, позволяющий избежать проблем, с которыми работают Команды, с какой версией является «тривиальным решением»:
ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c копировать output.mp4
Смотрите также: https://trac.ffmpeg.org/wiki/Concatenate для многих примеров.
источник