Принаймні, на 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_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 в цьому випадку потрібно.