Вопрос или проблема
Как закодировать с помощью ffmpeg в 6-битный цвет?
Существует много pix_fmt
, но я не вижу ни одного 6-битного.
6-бит существует как 64 цвета: https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#6-bit_RGB
$ ffmpeg -i INPUT.MP4 -pix_fmt rgb6 6-bit-output-test.mp4
[...]
Unknown pixel format requested: rgb6.
хотя я предпочел бы официальный pix_fmt
, у меня есть следующий обходной путь/решение:
генерация палитры:
wget https://upload.wikimedia.org/wikipedia/commons/3/3d/RGB_6bits_palette.png
ffmpeg -y -i RGB_6bits_palette.png -vf palettegen=max_colors=64:reserve_transparent=1 my64colorpalette.png
кодирование с использованием дезактивации:
ffmpeg -i INPUT.MP4 -i my64colorpalette.png -lavfi paletteuse -c:a copy 64color-output.mp4
или кодирование без дезактивации:
ffmpeg -i INPUT.MP4 -i my64colorpalette.png -lavfi paletteuse=dither=none -c:a copy 64color-output-no-dither.mp4
Ответ или решение
Обработка видео и изображений с помощью FFmpeg представляет собой мощный инструмент для пользователей, которые стремятся добиться максимальной гибкости в управлении медиа контентом. Однако, одной из известных ограничений является работа с пиксельными форматами, особенно если речь идет о малораспространенных форматах, таких как 6-битовый цвет. Рассмотрим, как можно выполнить это преобразование, исходя из вашей задачи и предложенного метода.
Теория
6-битовый цвет — это схема, которая использует три бита для красного, зелёного и синего каналов. Это позволяет создать 2^6, или 64 уникальных цвета. В контексте использования FFmpeg, 6-битовая цветовая палитра может быть невостребованной в виду её редкости и незначительного применения в современных медиа платформах, что может объяснить отсутствие её в списке поддерживаемых пиксельных форматов (pix_fmt
). Тем не менее, цель заключается в том, чтобы преобразовать видео в 6-битовую цветовую палитру, тем самым снижая количество цветов и, возможно, размер файла.
FFmpeg не поддерживает нативный формат rgb6
, что дополнительно усложняет задачу, но вы предложили решение через использование пользовательской палитры, что можно считать креативным подходом.
Пример
Первичная задача заключается в генерации палитры, соответствующей 6-битовой цветовой схеме. Вы использовали изображение из Википедии, чтобы создать необходимую двадцати четырехбитовую палитру PNG, содержащую 64 цвета, применяя команду palettegen
:
wget https://upload.wikimedia.org/wikipedia/commons/3/3d/RGB_6bits_palette.png
ffmpeg -y -i RGB_6bits_palette.png -vf palettegen=max_colors=64:reserve_transparent=1 my64colorpalette.png
После генерации палитры, вы используете её для кодирования видео с полученным набором цветов. Это достигается с применением фильтра paletteuse
, который позволяет применять цвета палитры для каждого кадра видео. Данная операция может сопровождаться выбором метода "дизеринга" (dithering), способного сгладить цветовые переходы за счёт добавления шума в случае, когда это необходимо:
Кодирование с использованием дизеринга:
ffmpeg -i INPUT.MP4 -i my64colorpalette.png -lavfi paletteuse -c:a copy 64color-output.mp4
Кодирование без использования дизеринга:
ffmpeg -i INPUT.MP4 -i my64colorpalette.png -lavfi paletteuse=dither=none -c:a copy 64color-output-no-dither.mp4
Применение и рекомендации
Это решение прекрасно подходит для ситуаций, в которых вам необходимо снизить количество используемых в видео цветов, например, при создании ретро-стилистики или для оптимизации анимации, где избыточность цвета может быть проблемой.
Преобразование видео в низкобитную цветовую палитру часто используется для оригинальных визуальных эффектов, что может быть полезным для дизайнеров и разработчиков игр, стремящихся воссоздать эстетику ранних видеоигр. Кроме того, уменьшение цветового диапазона может помочь в снижении размера файла, что критично для веб-приложений с ограничением пропускной способности.
Несмотря на отсутствие официального поддержки 6-битового пиксельного формата в FFmpeg, ваш подход с использованием фильтров палитры и дизеринга успешно решает задачу кодирования в 64-цветную схему. Такой подход можно использовать и для других нестандартных цветовых форматов, адаптируя палитру под конкретные нужды.
Для достижения лучших результатов, рекомендуется экспериментировать с различными параметрами фильтра дизеринга и иметь в виду, что выбор общего размера выходного видео и аудиокодека (например, copy
для аудио) остаётся за вами в зависимости от ваших предпочтений и требований к сохраняемому качеству.
Такое импровизированное решение демонстрирует, что, даже в условиях недостаточности стандартных инструментов, гибкость и богатство функций FFmpeg позволяет находить практичные и эффективные способы достижения поставленных целей в обработке видео.