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