Как максимально сохранить цвет RGB при конвертации серии PNG-файлов в видеоконтейнер с помощью ffmpeg?

Как максимально сохранить цвет RGB при конвертации серии PNG-файлов в видеоконтейнер с помощью ffmpeg?

У меня есть 950 файлов PNG, которые должны стать отдельными кадрами в 38-секундной видеодорожке по 25 кадров в секунду. Имена файлов идентичны, за исключением порядкового номера, как это принято в таких случаях.

Я хочу создать контейнер широко поддерживаемого формата, в идеале WebM, если он может соответствовать всем критериям, или MPEG-4, например, с кодеком, поддерживаемым современными браузерами для воспроизведения, из этой серии изображений PNG, которые у меня есть. Проблема в том, что цвета смещены, и цвет фона в декодированном видео больше не соответствует тому же триплету RGB, выбранному из цвета фона в изображениях PNG. Это приводит к тому, что видео выпирает из предполагаемого фона на моей HTML-странице, куда встроено видео.

Я попробовал простое:

ffmpeg -f image2 -i image%03d.png output.webm

что действительно дало мне видеодорожку VP9 с частотой 25 кадров в секунду, упакованную в контейнер WebM.

Изображения PNG имеют анимационный стиль, с сплошным фоном и простыми фигурами, анимированными на переднем плане. Они кажутся цветныминемаркированный(это то, что мне сообщает Adobe Bridge, я предполагаю, что это означает отсутствие встроенного цветового профиля или ссылки на него). Проблема с моей попыткой выше заключается в том, что даже при воспроизведении контейнера в Chrome фоновый цвет, взятый из изображения PNG с триплетом RGB #ED4D56, воспринимается не так, как фоновый цвет, который появляется в воспроизводимом видео.

Является ли это неизбежным побочным эффектом преобразования цветов RGB в YUV (кодирование) в RGB (воспроизведение)? Есть ли способ смягчить это? Я не настаиваю на том, чтобы кадры на видеодорожке были закодированы с использованием RGB, полагаю, YUV подойдет, если только современный браузер, воспроизводящий эти кадры, выдает тот же (с пренебрежимо малой погрешностью) триплет RGB при декодировании и отображении кадра(ов).

Мой вопрос в том, какую командную строку ffmpegя могу попробовать использовать, чтобы смягчить это? Я открыт для переключения видеокодека, формата пикселей, включения управления цветом в ffmpeg, если он существует, и т. д.

решение1

Недавно у меня была очень похожая задача, и я бы сказал, что идеального решения все еще нет (по состоянию на октябрь 2018 г.). Это побочный эффект низкоточного преобразования цветов RGB в YUV в RGB. Даже некоторые варианты кодеков "без потерь" (например, libvpx-vp9 -lossless) искажают цвета из-за цветового пространства YUV.

  • Если неточные цвета приемлемы, тоlibvpxКодек может сослужить неплохую службу:

    ffmpeg -r 25 -i image%03d.png -c:v libvpx -crf 4 -b:v 0 output.webm
    

    С этими настройками он выдал незначительное смещение цвета или даже точные цвета для некоторых наборов кадров. Кодеки VPx широко поддерживаются (все основные браузеры, кроме IE и Safari) и выдают разумный размер файла.

  • Если точные цвета строго требуются, то нам нужно избегать преобразования цветового пространства. Единственное кросс-браузерное решение, которое я придумал, это использоватьанимированный pngimages. ffmpegимеет только очень базовую поддержку apng, поэтому лучше использовать другие инструменты, например apngasm:

    apngasm output.png image001.png 1 25
    

    это будет работать везде, кроме IE и Edge (там он откатится к статическому первому кадру). Размеры файлов огромны, но это цена за настоящее кодирование без потерь.

  • Thelibx264rgbТакже следует упомянуть кодек - его использованиеволя будет правильным способом кодирования точных цветов RGB, когда/если браузеры будут его поддерживать.

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