По крайней мере , на FFmpeg 2.8.x (но старичок должен тоже работает) , вы можете использовать в 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_loop
введена новая опция ввода. Во-первых, он выглядит более простым и позволяет копировать содержимое без перекодирования:
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 требуется в этом случае.