Повтор/цикл ввода видео с помощью ffmpeg?


34

Я просто хочу зациклить видео 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."

38

Concat demuxer

Это позволяет вам зациклить вход без необходимости перекодирования.

  1. Сделайте текстовый файл.Содержимое примера текстового файла повторить 4 раза.

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. Тогда бегиffmpeg:

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Для пользователей Linux

Этот пример такой же, как и выше, но вам не нужно делать вручнуюlist.txt:

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

С наиболее часто используемыми современными оболочками вы можете даже избежать созданияlist.txtфайл целиком.Например, с помощью bash:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

Также см:


контурный фильтр

Пример использованияloop filterдля цикла 4 раза каждый цикл составляет 75 кадров, каждый цикл пропускает первые 25 кадров ввода:

ffmpeg -i input -filter_complex loop=3:75:25 output
  • Фильтрация требует перекодирования.
  • Этот фильтрplaces all frames into memory,
  • С помощьюloop=3будет зацикливаться 4 раза.
  • Для бесконечного цикла-1,
  • Вы должны указать количество кадров для цикла (показано в примере 75).Максимальное значение 32767.
  • Также смffmpeg -h filter=loop,

фильтр фильма

movie filterесть опция циклаУвидетьanswerниже Монах Тук.Фильтрация требует перекодирования.Для аудио используйте фильтр amovie.


-stream_loopвариант

Увидетьanswerниже Thingy иanswerМульви.Обратите внимание, что эта опция глючит (см. Отчеты об ошибках#6121а также#5719) и может не работать на вас.Как упомянул мульвия в билете № 6121, один из обходных путей - сначала переделать в MKV или TS, а затем использовать-stream_loopв следующей команде.


-loopвариант

-loopопция специфична дляimage file demuxerа такжеgif muxer, поэтому он не может быть использован для типичных видеофайлов, но может использоваться для бесконечного цикла серии входных изображенийЭтот пример будет повторяться снова и снова, но-t 30ограничит продолжительность вывода до 30 секунд:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

Или зациклить вывод GIF:

ffmpeg -i input -loop 3 output.gif
  0

Это нормально работает с файлами mp4? 28 окт. 142014-10-28 19:08:12

+2

Я получаю эту ошибку '><(для i в {1..4}; сделать printf" файл '% s' \ n "input.mp4; готово) -bash:/dev/fd/63: разрешение отклонено' 09 ноя. 152015-11-09 18:46:50

  0

@jamesfzhang - я думаю, это потому, что вам нужен абсолютный путь к файлу (как описано здесь: https://trac.ffmpeg.org/wiki/Concatenate).Для этого вы можете написать: ffmpeg -safe 0 -f concat -i <(для i в {1..4}; сделать printf "file '$ PWD'/'% s' \ n" input.mp4; done) -c копировать output.mp4 18 май. 172017-05-18 15:57:46


14

По крайней мере, на FFmpeg 2.8.x (но oldie тоже должен работать) вы можете использоватьlavfiв качестве входного формата и сложного фильтра графа с использованиемmovieа такжеsetptsфильтры в качестве аргумента для-iвариант.

Следующая команда делает эту работу за вас:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

Нульloop=Аргументы означают бесконечный цикл.Значения с большим нулем устанавливают количество повторений.setptsфильтры, необходимые для настройки PTS для второго и последующих повторов, в противном случае большинство выходных сглаживателей выйдут из строя с немонотонным увеличением PTS: цикл не вызывает PTS.

Обратите внимание, что использование фильтров, предполагающих, что обход кадров без декодирования/кодирования невозможен: по конструкции фильтры работают только с декодированными кадрами.

У FFmpeg 2.8.2 новая опция ввода-stream_loopinroduced.Во-первых, он выглядит более простым и позволяет копировать контент без перекодирования:

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

Но это не пересчитывает PTS и выходной файл неверен.Если вы добавите фильтр для исправления PTS (см.setpts) вы должны удалить-c copyтоже.Только битовые фильтры могут работать с закодированными пакетами, но нет никаких битовых фильтров для исправления PTS (см .:https://ffmpeg.org/ffmpeg-bitstream-filters.html)

В любом случае ffmpeg на втором проходе завершается с ошибкой:

input.mp4: Resource temporarily unavailable

Известная работа для меня: использовать контейнер для входного файла без ограничений PTS (потоковый контейнер).Один из них, известный мне, это MPEG-TS.Итак, вы можете просто конвертировать MP4-файл в MPEG-TS:

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

И используйте следующую команду для создания файла бесконечности:

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(Фильтры битового потока должны использоваться только при необходимости, на моих примерах это требуется)

FFmpeg> = 2.8.2 требуется в этом случае.

+1

Выполнение этой команды вызывает ошибку: «[mp4 @ 00000000053fa1a0] Не удалось найти тег для кодека rawvideo в потоке # 0, кодек в данный момент не поддерживается в контейнере».Если я добавлю -vcodec h264 перед вводом, эта ошибка исчезнет, ​​но кодер не выйдет.Предоставление ненулевого числа циклов приводит к множеству ошибок, но завершается.Файл не является допустимым выводом. 18 ноя. 152015-11-18 08:35:28

+1

Документация для stream_loop гласит: «Цикл 0 означает отсутствие цикла, цикл -1 означает бесконечный цикл». 18 ноя. 152015-11-18 08:36:47

  0

Кажется, неверные входные файлы.Не могли бы вы поделиться им?«Цикл 0 означает отсутствие цикла, цикл -1 означает бесконечный цикл».- кажется, я вижу старые документы :-) 18 ноя. 152015-11-18 13:43:11

  0

Мои были действительными MP4, но не могут поделиться теми, что я использовал. Вы можете сгенерировать один, используя ffmpeg, а затем использовать его.Вставьте вывод консоли, если он работает. 18 ноя. 152015-11-18 14:56:17

+1

Я забыл: фильтры предполагают транскодирование (декодирование/кодирование).По дизайну.Поэтому вы должны удалить '-c copy'.Ответ исправлен. 18 ноя. 152015-11-18 16:48:45

+1

Приятно знать, но это существенное ограничение, если у вас есть большой цикл для генерации. 18 ноя. 152015-11-18 17:02:13

  0

Добавьте информацию о stream_loop и WA, чтобы исправить проблему PTS без перекодирования.FFmpeg> = 2.8.2 требуется. 18 ноя. 152015-11-18 17:22:40

  0

@MonahTuk Я считаю, что фильтр петель работает намного лучше, чем stream_loop (что вызывает короткую паузу для любого файла, который я пробовал), за одним исключением: когда я добавляю фильтр петель, звук исчезает? 22 июн. 172017-06-22 12:56:13

  0

@MikeVersteeg, вы должны проверить файлы.Время от времени различные дорожки в файле имеют немного различную длину или смещение, что может повлиять на мультиплексирование.Проблемы в никогда версии FFmpeg также могут возникнуть.Также наиболее работоспособный случай - использовать контейнер MPEG TS в качестве входа и выхода. 23 июн. 172017-06-23 00:05:28


10

В ffmpeg 2.8.4 следующая команда создает output.mp4, который является повторяющейся копией input.mp4 до тех пор, пока не будет остановлен

ffmpeg -stream_loop -1 -i input.mp4 -c copy -fflags +genpts output.mp4
+2

Кажется, самый быстрый метод 23 янв. 172017-01-23 17:43:24

  0

Самый быстрый метод - это преуменьшение, этот метод увеличивает количество часов до нескольких часов за несколько секунд. 13 фев. 182018-02-13 23:28:34


0

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 для многих примеров.

  0

Это не делает * никакой * конкатенации.Необходимо использовать хотя бы один из методов concat: протокол, фильтр или демультиплексор.В этой команде автоматическое отображение ffmpeg выберет одно видео, один звук и один поток субтитров из числа входов.Поскольку они идентичны, это эквивалентно первой команде ОП. 11 мар. 172017-03-11 06:36:50

  0

Спасибо за тестирование этого Mulvya, так как оно отличается от поведения, описанного в Документах: https://ffmpeg.org/ffmpeg.html#Description - Если есть сходство в именах файлов с использованием "-i -i/tmp/test% d .mp4 "(et. al) также возможно. 11 мар. 172017-03-11 17:28:19