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