视频在 Safari 和 Chrome 中的渲染比在 Firefox 中略亮

Posted

技术标签:

【中文标题】视频在 Safari 和 Chrome 中的渲染比在 Firefox 中略亮【英文标题】:Video renders slightly brighter in Safari and Chrome than in Firefox 【发布时间】:2017-02-28 20:20:55 【问题描述】:

我正在尝试将视频的一小部分放在较大的静态 PNG 背景上,并且视频的边缘应该与背景无缝融合,即。您应该无法识别视频的结束位置和背景中的静态图像的开始位置。

但是,我发现每个浏览器都会以不同的方式呈现视频颜色。在 Chrome 中,这取决于您是否添加任何 CSS 过滤器(-webkit-filter)属性,例如

filter: saturate(100%)

(根本不应该改变视频)。我创建了这个 JSFiddle 来演示问题https://jsfiddle.net/bj4hshwz/1/。没有它,它会使视频稍微亮一点。使用 filter 属性,视频更暗/更饱和(在我的情况下与背景匹配)。 Firefox 可以正确渲染视频并且与背景匹配,而在 Safari 中,无论您是否添加过滤器,它总是更亮。

有没有办法让 Safari 中的视频也正确?

【问题讨论】:

我也注意到了这一点。感谢分享过滤技巧。 【参考方案1】:

无操作过滤器更改渲染是一个错误。您应该将其报告给浏览器供应商。您减少的测试用例将有助于解决此问题。

除此之外,视频中的颜色配置文件处理存在问题,而且有点乱。

网络上的图像和 CSS 颜色通常使用 sRGB 颜色空间,但视频在内部使用一些其他颜色空间,最常见的是 Rec. 709(用于高清)和 BT。 601(旧标清电视)。

问题是这些配置文件非常相似,以至于许多软件不关心它们之间的转换,或者转换不正确(这很容易,因为有这么多微妙的不兼容的颜色空间称为“YUV”)。只有当您尝试完全匹配颜色时(就像您所做的那样),错误才会变得明显。

Rec 709 的 gamma 约为 2.4,sRGB 的 gamma 约为 2.2,因此不能在它们之间精确转换的软件会使亮度略微下降。 709/601 混合会稍微改变色调。

要使视频颜色与 CSS 颜色完全匹配,所有星星必须对齐:

    用于生成视频的软件需要读取 sRGB 中的颜色并将其正确转换为视频的颜色空间(例如 Rec. 709)。它可能不会,除非您设置适当的标志/复选框。 有关视频色彩空间的信息应嵌入视频文件的元数据中,以免播放器猜到。无论如何,一些玩家会猜测(例如,Firefox 假定低分辨率视频不能使用高清色彩空间)。 播放器(浏览器)必须了解视频色彩空间并能够为视频选择正确的色彩空间。 浏览器必须通过将颜色转换为显示颜色空间来播放视频(上次我检查 Firefox 没有这样做,除非您手动启用了隐藏选项)。 浏览器必须将 CSS 颜色从 sRGB 转换为显示颜色空间(或者失败,不理会 CSS 颜色,但始终将视频转换为 sRGB)。 Chrome 在这方面做得很差。

您可以指望 Safari 正确地执行所有这些操作,但在其他浏览器中,它通常是无可救药的错误。考虑更改您的设计以隐藏差异?

【讨论】:

【参考方案2】:

我在 android 版 Chrome 上注意到了这一点,因此我使用以下代码来定位 Android 版 Chrome:

@media screen and (-webkit-min-device-pixel-ratio:3) and (pointer:coarse)
video:first-child 
    filter: contrast(1)
    

...但它不适用于全屏。

我最终发现的建议是将chrome://flags/#force-color-profile 设置为sRGB

这完全解决了问题。

【讨论】:

以上是关于视频在 Safari 和 Chrome 中的渲染比在 Firefox 中略亮的主要内容,如果未能解决你的问题,请参考以下文章

Safari 和 Chrome 中的 HTML5 视频海报属性

在播放框架中渲染视频

Chrome 和 Safari 中子弹列表菜单的 CSS 渲染

Safari 字体渲染问题

在 Safari 和 Mobile Chrome 上以编程方式播放有声视频

VideoJS 适用于 safari 但不适用于 chrome 中的某些带有 CORS 的视频