Hatred's Log Place

DON'T PANIC!

Nov 18, 2015 - 1 minute read - Comments -

FFmpeg loop input

Если нужно сделать повторный стриминг небольшого файла (или просто сделать большой файл из нескольких повторов маленького), то поможет такая команда:

ffmpeg -re -f lavfi -i "movie=filename=/some/path/input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" -ar 44100 -f flv rtmp://some.server/app/live

Чуть подробнее: 1. -re процессит входные фреймы так, как если бы это был live stream 2. формат входного файла lavfi говорит, что входной файл, это не регулярный файл, устройство или сетевой ресурс, а описание графа фильтра (комплексного) 3. соответственно аргументом -i становится описание графа фильтра: 1. movie - фильтр задаёт источник данных, а его параметр loop=N задаёт число повторов, 0 - бесконечное число раз, отличное от нуля - будет сделано именно такое число повторов. 2. setpts - предыдущий фильтр действует принципу KISS: попросили повторять файл - буду, но PTS будет оставаться без модификаций, соответсвенно муксеру это может (и даже, скорее всего, обязательно) показаться неприятным. Соответственно нам нужно пересчитать PTS на основе прошедших (N) кадров, фреймрейта (FRAME_RATE) и time-base входного PTS (TB, про time-base я уже писал)

Дальнейшие опции роли не играют и могут сильно варьироваться. Выходным файлом может быть что угодно. Проблемы могут быть с входными файлами с переменным фреймрейтом, но я таких не видел.

Продублировал как ответы на вопросы на сайта Stack Exchange: * http://video.stackexchange.com/a/16933/12104 * http://stackoverflow.com/a/33774838/1828241