Почему при конвертации в GIF-файл в FFmpeg видео получается пикселизированным?

Почему при конвертации в GIF-файл в FFmpeg видео получается пикселизированным?

Я хочу закодировать это видео WEBM:

Я заметил, что FFmpeg проигрывает в плане качества.

Я делаю WEBM в GIF, если это поможет. И почти все онлайн-конвертеры используют FFmpeg под капотом, что приводит к той же потере качества.

Обратите внимание, что первый кадр в кодировке FFmpeg очень пикселизирован:

введите описание изображения здесь

Вот команда, которую я использовал для кодирования.

ffmpeg -i connecting.webm -vf "fps=40,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif

Даже если я преобразую исходный WEBM в MP4 вместо GIF, потеря качества сохраняется.

И мне пришлось добавить -vfопцию исправления багнутой частоты кадров. Багнутая конвертация внизу.

введите описание изображения здесь

Почему это происходит?

решение1

Исходный входной файл WebM имеет альфа-канал (прозрачность).
Возможным решением является наложение полупрозрачного видео на черный фон:

ffmpeg -y -c:v libvpx-vp9 -i connecting.webm -vf "[v:0]fps=40[v0];color=black:rate=40[b];[b][v0]scale2ref[b][v0];[b]setsar=1[b];[b][v0]overlay=shortest=1,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif

При игнорировании альфы видео получается пикселизированным, поскольку плавность создается за счет постепенного изменения прозрачности вокруг объекта.


  • -c:v libvpx-vp9- Использовать libvpx-vp9декодер. Он нам нужен, так как декодер по умолчанию игнорирует альфа-канал (прозрачность).
  • color=black:rate=40[b]- Создает черное видео с частотой 40 кадров в секунду и некоторым номинальным разрешением.
  • [b][v0]scale2ref[b][v0]- Масштабирует черное видео до разрешения входного видео.
  • [b]setsar=1[b]- Установите соотношение сторон черного видео 1:1.
  • [b][v0]overlay=shortest=1- накладывает входное видео на черное видео.
  • scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse"- масштабировать сгенерировать палитру и использовать ее, как в вопросе.

Выход:
введите описание изображения здесь


Замечания по альфа-каналу (прозрачности) входного сигнала:

При выполнении ffprobe connecting.webmотображается:

  Stream #0:0: Video: vp9 (Profile 0), yuv420p(tv, progressive), 400x400, SAR 1:1 DAR 1:1, 60 fps, 60 tbr, 1k tbn (default)
    Metadata:
      alpha_mode      : 1
      ENCODER         : Lavc58.134.100 libvpx-vp9
      DURATION        : 00:00:01.067000000

Метаданные alpha_mode : 1отмечают наличие альфа-канала (прозрачности).

Я думаю, что это какая-то "особая" конфигурация (обычно я ожидаю, что формат пикселей будет yuva420p, а не yuv420p, когда есть альфа-канал).
Есть некоторая документация о том, что alpha_mode : 1связано сКодировка VP8.

Связанный контент