Вопрос или проблема
Я конвертирую видео в гифки с помощью FFmpeg, но сталкиваюсь с проблемой, с которой многие уже сталкивались: многие проигрыватели гифок отказываются воспроизводить гифки с частотой выше 50FPS (2 сотые секунды продолжительность кадра). Формат гифок технически позволяет до 100FPS, но не все проигрыватели это поддерживают.
У меня есть код, который ограничивает FPS до 50FPS, но проблема в том, что FFmpeg, кодируя из странной частоты кадров, такой как 29.97fps, иногда генерирует кадры в 1/100 с, поскольку продолжительность каждого кадра независима.
Я хочу, идеально, с помощью одной команды ffmpeg, сгенерировать ГИФ нужной скорости (не замедляя и не ускоряя), но без генерации кадров в 1/100 с. Это возможно?
Для Ротема код просто
outname = reserve_tempfile("gif")
fps = await get_frame_rate(video)
await run_command("ffmpeg", "-i", video,
# предотвращает частичные кадры, делает размер файла больше, но исправляет проблемы с прозрачностью
"-gifflags", "-transdiff",
"-vf",
# ограничивает fps, потому что гифки какие-то странные
# TODO: https://superuser.com/q/1854904/1001487
("fps=fps=50," если fps > 50 иначе "") + \
# создать и использовать хорошую палитру
"split[s0][s1];[s0]palettegen=reserve_transparent=1[p];[s1][p]paletteuse=bayer",
# я так ненавижу гифки
"-fps_mode", "vfr",
outname)
Ответ или решение
Для решения проблемы с созданием GIF-анимаций из видео с использованием FFmpeg и минимизации времени кадра без получения 1/100-секундных кадров, необходимо учитывать несколько важных аспектов. В данной статье мы рассмотрим метод, который позволяет установить максимальную частоту кадров (fps) на уровне 50, а также избегать 1/100-секундных кадров при кодировании GIF.
Основные проблемы
Многие игроки GIF не поддерживают воспроизведение анимаций с частотой кадров выше 50 FPS. Несмотря на то, что формат GIF допускает частоту до 100 FPS, это может привести к проблемам при воспроизведении. При использовании FFmpeg для видео с нестандартной частотой кадров (например, 29.97 FPS) могут генерироваться кадры с частотой 1/100 секунды, что недопустимо для большинства проигрывателей.
Решение с использованием FFmpeg
Предлагаю алгоритм, который будет однокомандным способом создавать GIF с заданной частотой кадров и исключать 1/100-секундные кадры. Мы будем использовать такие параметры FFmpeg, как fps
, palettegen
и paletteuse
, чтобы обеспечить качественное кодирование и избежать лишних кадров.
Пример команды FFmpeg
ffmpeg -i input_video.mp4 -vf "fps=fps=50,split[s0][s1];[s0] palettegen=reserve_transparent=1[p];[s1][p] paletteuse=bayer" -gifflags -transdiff -fps_mode vfr output.gif
Объяснение параметров
-
-i input_video.mp4: указывает входное видеофайл, который вы хотите конвертировать в GIF.
-
-vf "fps=fps=50,split[s0][s1];[s0] palettegen=reserve_transparent=1[p];[s1][p] paletteuse=bayer":
fps=fps=50
: ограничивает частоту кадров на уровне 50 FPS.split[s0][s1]
: делит поток для параллельной обработки.[s0] palettegen=reserve_transparent=1[p]
: создает палитру для GIF с поддержкой прозрачности.[s1][p] paletteuse=bayer
: применяет палитру к итоговому GIF.
-
-gifflags -transdiff: оптимизирует анимацию GIF, минимизируя размер файла за счет использования прозрачности.
-
-fps_mode vfr: устанавливает переменную частоту кадров (variable frame rate), что помогает избежать создания фиксированных 1/100-секундных кадров.
Дополнительные рекомендации
- Проверьте частоту кадров оригинального видео с помощью команды
ffprobe
перед конвертацией, чтобы убедиться, что при необходимости сделан правильный выбор. - Используйте более низкое разрешение для GIF, чтобы уменьшить размер файла, особенно если это необходимо для быстрой загрузки в веб-приложениях.
- Если GIF включает в себя много кадров, возможно, стоит рассмотреть использование другого формата для анимации, например, WebP, поддерживающего более высокие частоты кадров и меньший размер файла.
Заключение
Используя вышеуказанную команду FFmpeg, вы можете эффективно создавать GIF-файлы с ограниченной частотой кадров на уровне 50 FPS и избегать проблем, связанных с созданием 1/100-секундных кадров. Это обеспечит совместимость с большинством GIF-проигрывателей и улучшит пользовательский опыт.