
Я хочу закодировать это видео 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.