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

577
amn

У меня есть 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
Как генерировались PNG? Какие-то конкретные цветовые свойства? Gyan 6 лет назад 0
Создано с помощью After Effects. Никаких конкретных цветовых свойств, которые я могу придумать, если я вас правильно понимаю, - изображения не содержат никакого цветового профиля, а представляют собой просто не отмеченные изображения RGB. amn 6 лет назад 0
Ранее у меня был комментарий о том, что PNG не способны удерживать профиль, что на самом деле было некорректно, поэтому я удалил его - однако PNG, сохраненные в Photoshop, не могут иметь встроенные профили, хотя файл ** может ** технически содержать его. Не удивил бы меня, если бы AE был похож. Я бы конвертировал в sRGB при экспорте и посмотрел, работает ли он. Tetsujin 6 лет назад 0

1 ответ на вопрос

0
semyonfilippov

Недавно у меня была очень похожая задача, и я бы сказал, что до сих пор нет идеального решения (по состоянию на октябрь 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) и обеспечивают приемлемый размер файла.

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

    apngasm output.png image001.png 1 25 

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

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

Похожие вопросы