Как кодировать с помощью ffmpeg в 6-битный цвет?

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

Как закодировать с помощью 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 позволяет находить практичные и эффективные способы достижения поставленных целей в обработке видео.

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

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