Вопрос или проблема
Я хочу создать видео из изображения с заданной продолжительностью. Продолжительность может иметь миллисекунды до трех десятичных знаков.
Давайте создадим простое изображение для нашего эксперимента. Следующая команда создает изображение 100×100, где все пиксели красные.
convert -size 100x100 xc:red red.png
Я знаю, что можно создать видео из изображения, передав следующие флаги в ffmpeg
. Мы также можем использовать ffprobe
, чтобы вывести продолжительность файла.
ffmpeg -v error -y -loop 1 -i red.png -t 3 output.mp4
ffprobe -v error -show_entries stream=duration -print_format default=nk=1:nw=1 output.mp4
3.000000
Когда я устанавливаю продолжительность на 3.1
, ffprobe
показывает 3.12
как продолжительность файла. Однако я хочу, чтобы продолжительность получившегося файла была 3.1
.
ffmpeg -v error -y -loop 1 -i red.png -t 3.1 output.mp4
ffprobe -v error -show_entries stream=duration -print_format default=nk=1:nw=1 output.mp4
3.120000
Как сделать так, чтобы ffmpeg
создал видеофайл с продолжительностью 3.1
секунды?
ffmpeg по умолчанию использует 25fps (если частота кадров не указана).
25fps = 40мс на кадр. 3.12сек делится на 40мс. 3.1сек нет.
Вам нужно использовать флаг -r
, чтобы установить частоту кадров на 50fps (20мс на кадр), или любое значение, на которое 3.1 делится без остатка.
Чтобы установить точную продолжительность в ffmpeg, продолжительность всегда должна быть кратна длительности кадра, иначе ffmpeg округлит до ближайшего PTS.
ffmpeg -framerate 29.97 -t 1.936 -pattern_type glob -i “*.jpg” -threads 8 -vcodec h264 -crf 18 -y output.mp4
Ответ или решение
Для создания видео из изображений с заданной продолжительностью, единственно подходящим инструментом является FFmpeg. В вашем случае, когда требуется установить длительность с точностью до трех десятичных знаков, необходимо учитывать частоту кадров, поскольку именно она влияет на итоговую продолжительность.
Шаг 1: Генерация изображения
Сначала создадим простое изображение, как вы и указали. Для этого мы воспользуемся командой convert
:
convert -size 100x100 xc:red red.png
Эта команда создает красное изображение размером 100 на 100 пикселей и сохраняет его в файл red.png
.
Шаг 2: Определение частоты кадров
FFmpeg по умолчанию использует 25 кадров в секунду (fps). Это означает, что каждый кадр занимает 40 миллисекунд (ms). Однако, как вы заметили, 3.1 секунды (или 3100 мс) не делится на 40. Следовательно, возникает проблема округления.
Для точного указания продолжительности видео, оно должно быть кратно продолжительности одного кадра. В этом случае целесообразно установить частоту кадров выше, чтобы избежать неточностей.
Рекомендуется установить частоту кадров на 50 fps, так как это позволит достичь длительности в 20 ms на кадр, а 3100 мс делится на 20.
Шаг 3: Команда для FFmpeg
Используйте следующую команду для создания видео с заданной длительностью:
ffmpeg -loop 1 -i red.png -t 3.1 -r 50 -c:v libx264 -preset veryfast -crf 18 -y output.mp4
В этой команде:
-loop 1
— говорит FFmpeg зациклить изображение.-i red.png
— указывает входное изображение.-t 3.1
— устанавливает длительность видео в 3.1 секунды.-r 50
— задает частоту кадров 50 fps.-c:v libx264
— указывает кодек для сжатия видео.-preset veryfast
— устанавливает быстроту кодирования.-crf 18
— указывает качество сжатия (чем ниже значение, тем лучше качество).-y
— перезаписывает выходной файл без запроса подтверждения.
Шаг 4: Проверка длительности видео
После генерации видео проверьте его длительность с помощью команды ffprobe
:
ffprobe -v error -show_entries stream=duration -of default=nk=1:nw=1 output.mp4
Эта команда должна показать результат 3.10, что является необходимым значением.
Заключение
Установка частоты кадров является критическим аспектом при создании видео с заданной длительностью. Если вы хотите добиться высокой точности, обязательно выбирайте частоту, обеспечивающую кратность продолжительности вашего видео. В приведенной инструкции все шаги описаны детально и с учётом возможных проблем при генерировании видео на основе изображений.