Установить минимальное время кадра для GIF в FFmpeg

Вопрос или проблема

Я конвертирую видео в гифки с помощью 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

Объяснение параметров

  1. -i input_video.mp4: указывает входное видеофайл, который вы хотите конвертировать в GIF.

  2. -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.
  3. -gifflags -transdiff: оптимизирует анимацию GIF, минимизируя размер файла за счет использования прозрачности.

  4. -fps_mode vfr: устанавливает переменную частоту кадров (variable frame rate), что помогает избежать создания фиксированных 1/100-секундных кадров.

Дополнительные рекомендации

  • Проверьте частоту кадров оригинального видео с помощью команды ffprobe перед конвертацией, чтобы убедиться, что при необходимости сделан правильный выбор.
  • Используйте более низкое разрешение для GIF, чтобы уменьшить размер файла, особенно если это необходимо для быстрой загрузки в веб-приложениях.
  • Если GIF включает в себя много кадров, возможно, стоит рассмотреть использование другого формата для анимации, например, WebP, поддерживающего более высокие частоты кадров и меньший размер файла.

Заключение

Используя вышеуказанную команду FFmpeg, вы можете эффективно создавать GIF-файлы с ограниченной частотой кадров на уровне 50 FPS и избегать проблем, связанных с созданием 1/100-секундных кадров. Это обеспечит совместимость с большинством GIF-проигрывателей и улучшит пользовательский опыт.

Оцените материал
Добавить комментарий

Капча загружается...