1

У меня есть 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 ответ1

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .