Разница между FFMPEG eq (яркость / контрастность / насыщенность) и CSS-фильтрами?

619
justswim

У меня есть видео, и я пытаюсь скопировать некоторые фильтры CSS для видео с FFMPEG.

Вот скриншот из видео в CSS со свойством filter: contrast(150%):

CSS Filtered contrast

Я попытался воссоздать этот эффект в FFMPEG с фильтром eq, установив контраст на 1,5

ffmpeg -y -i ./input.mp4 -vf "eq=contrast=1.5:brightness=0:saturation=1" -pix_fmt yuv420p ./filtered_input.mp4 

И мой вывод выглядит так:

enter image description here

Вот изображение этих двух скриншотов рядом:

enter image description here

Вы можете видеть, что изображение слева (отфильтрованное с помощью CSS) выглядит немного белее / голубее, если вы посмотрите на снег между изображениями.

Вот ссылка на оригинальное видео: https://i.imgur.com/dDmp16s.mp4

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

Моя мета точка в том, что фильтры eq от FFMPEG дают очень разные результаты от соответствующих фильтров CSS. Кто-нибудь знает, почему это может происходить, и как я могу заставить их соответствовать?

2

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

3
Chungzuwalla

Моя мета точка в том, что фильтры eq от FFMPEG дают очень разные результаты от соответствующих фильтров CSS. Кто-нибудь знает, почему это может происходить?

Среди всех поставщиков программного обеспечения нет единого мнения о том, как должны работать яркость, контрастность и насыщенность.

Фильтры CSS будут иметь точные математические определения, определенные W3C. Они должны быть точными, чтобы разные браузеры разных производителей могли отображать одно и то же изображение. Текущая спецификация для фильтров CSS находится здесь: https://www.w3.org/TR/filter-effects-1/

С другой стороны, фильтры ffmpeg реализованы специальным образом группой (очень умных) инженеров и не обязаны соответствовать каким-либо стандартам. Они просто должны быть полезны с точки зрения разработчиков ffmpeg.

и как я могу заставить их совпадать?

Я ожидаю, что единственный способ точно узнать, что делает фильтр ffmpeg, - это прочитать исходный код (другими словами, исходный код - это спецификация). Сделав это, вы сможете определить входные параметры, которые дадут вам тот же математический результат, что и фильтры CSS. А может и нет.

Поскольку фильтры ffmpeg не обязаны соответствовать какому-либо стандарту, существует риск того, что будущее обновление ffmpeg может изменить результат.

РЕДАКТИРОВАТЬ : Другая вещь, которую следует опасаться, это то, что, даже если числовые значения цвета в обоих видеофайлах одинаковы, они могут отображаться по-разному при воспроизведении. Одна из причин заключается в том, что метаданные о цветовом пространстве были потеряны или изменены во время обработки, так что выходные данные ffmpeg находятся в другом цветовом пространстве, чем исходное видео, в результате чего проигрыватель по-разному интерпретирует числовые значения цвета. Другая причина в том, что один игрок поддерживает преобразования цветового пространства, которые другой не поддерживает. Основываясь на скриншотах выше, похоже, что они просматриваются в разных проигрывателях (браузер против чего-то еще). Лучше всего просматривать оба видео в одном плеере.

Спасибо за это, я хотел использовать фильтры CSS для предоставления визуальных обновлений видео в браузере в реальном времени, а затем отправлять параметры обратно в FFMPEG для визуализации. Я играл с отображением значений, но это не сработало. Есть идеи по поводу других решений? Sabba Keynejad 6 лет назад 0
Если бы мне нужно было это сделать, я бы прочитал спецификацию фильтра CSS по приведенной выше ссылке, загрузил исходный код ffmpeg и реализовал свой собственный фильтр ffmpeg, в котором реализованы математические определения фильтров CSS, которые мне нужны для моего веб-сайта. Документация для разработчиков ffmpeg объясняет, как это сделать, с помощью простых шаблонов для копирования и вставки. Если бы я чувствовал себя особенно милосердным, я бы, вероятно, также предложил готовый фильтр сообществу ffmpeg. Chungzuwalla 6 лет назад 1
Не нужно все это делать. Фильтр eq имеет две подпрограммы, которые работают с данными пикселей. Один из них математически эквивалентен CSS, но активируется только в том случае, если пользователь предоставляет выражение для изменения гаммы. Это просто вопрос, позволяющий пользователю выбрать этот код по выбору, без изменения гаммы. Gyan 6 лет назад 0
@Chungzuwalla большое спасибо. Я нашел обходной путь, где я использую виртуальный браузер, чтобы применить стиль CSS к изображению, а затем снова сделать его как изображение. Я добавлю пост здесь, когда все будет готово с некоторой документацией о том, как я это сделал. Sabba Keynejad 6 лет назад 0
0
maxpaj

Из другого потока

filter: contrast(c) saturate(s); 

эквивалентно

eq=contrast=c:saturation=c*s 

Не уверен насчет параметра яркости.

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