我有一个视频,客户希望“无缝地”坐在网站上。视频的背景HEX颜色与网站的HEX背景颜色相匹配,并在某些浏览器中呈现,某些版本,某些时候?
最令人好奇的是,Chrome会以不同方式呈现视频背景,直到您打开颜色选择器。然后他们突然匹配。要清楚,它只在我打开颜色选择器而不是调试器时修复它(读:这不是重新绘制的问题)。
当我第一次导航到网站时,Firefox的渲染方式不同,但是如果我点击cmd + r,它就变得完全无缝。看一下屏幕截图 - 他们用文字说的话比我说得多。
我正在说服客户改变视频的白色背景,因为这肯定会“修复”它,但我对这是怎样/为什么会发生这种情况非常好奇。
你有什么见解向导吗?
Codepen:http://codepen.io/anon/pen/zrJVpX
<div class="background" style="background-color: #e1dcd8; width: 100%; height: 100%;">
<div class="video-container">
<video id="video" poster="" width="90%" height="auto" preload="" controls style="margin-left: 5%; margin-top: 5%;">
<source id="mp4" src="http://bigtomorrowdev.wpengine.com/wp-content/themes/bigtomorrow/images/videos/bt-process.mp4" type="video/mp4">
<source id="webm" src="http://bigtomorrowdev.wpengine.com/wp-content/themes/bigtomorrow/images/videos/bt-process.webm" type="video/webm">
<source id="ogg" src="http://bigtomorrowdev.wpengine.com/wp-content/themes/bigtomorrow/images/videos/bt-process.ogv" type="video/ogg">
We're sorry. This video is unable to be played on your browser.
</video>
</div>
</div>
答案 0 :(得分:8)
似乎它可能是浏览器呈现视频的基础,而不是简单的CSS / HTML修复。您的问题听起来与this question类似。我认为答案在于渲染引擎和颜色空间差异的某种组合,这可能意味着没有好的方法可以跨浏览器修复它。
在Firefox上,您可以尝试摆弄色彩管理设置,看看是否会改变行为。这不会解决问题,但它可以帮助解释它。在URL /搜索栏中,输入&#34; about:config&#34;。它应该带你到一个选项页面。另一个搜索栏将显示在页面中,输入&#34; gfx.color_management.mode&#34;。该选项可以取值0,1,2。尝试切换它们并重新加载页面(可能需要重新启动firefox)以查看是否可以获得一致的差异。如果首先没有管理颜色,它可能会有所不同。
同样,您可以尝试在chrome中禁用硬件加速视频解码。输入&#34; chrome:// flags&#34;在chrome URL /搜索栏中,然后找到标志&#34;禁用硬件加速视频解码&#34;。更改它的任何值,重新启动chrome,然后再次检查颜色。
这些都不是我认识到的解决方案,这可能更适合作为评论,但我还没有代表。
答案 1 :(得分:7)
问题不仅仅取决于浏览器,还取决于渲染。一旦浏览器使用硬件加速渲染视频,GPU首选项就会影响颜色。
例如,如果您使用的是Nvidia显卡,则可以在Nvidia控制面板中更改颜色首选项。桌面显示器通常使用 0到255 的完整RGB范围,但您也可以配置 16到235 的有限RGB范围。有限的范围通常用于电视。
一方面,图形卡驱动程序有时会将桌面显示器的颜色范围默认为有限的RGB范围。另一方面,用户可以自己更改此值。 由于您无法影响用户的浏览器设置或图形卡驱动程序设置,因此不同用户始终存在差异。
Full RGB range -> limited RGB range
#000000 becomes #161616
#081F3C becomes #172A43
#FFFFFF becomes #EBEBEB
我已经使用Chrome,Chrome智能手机,Edge,Firefox和Internet Explorer 11对其进行了测试。
视频准备好播放或播放后,请检查视频的第一个像素并相应更改周围容器的背景颜色。无论浏览器设置和渲染配置如何,这都将有效。
这是代码:
<!doctype html>
<html>
<head>
<title>Video</title>
<script>
function isColorInRange(expectedColor, givenColor) {
const THRESHOLD = 40;
for (var i = 0; i < 3; i++) {
if (((expectedColor[i] - THRESHOLD) > givenColor[i])
|| ((expectedColor[i] + THRESHOLD) < givenColor[i])) {
return false;
}
}
return true;
}
function setVideoBgColor(vid, nativeColor) {
if (vid) {
var vidBg = vid.parentElement;
if (vidBg) {
// draw first pixel of video to a canvas
// then get pixel color from that canvas
var canvas = document.createElement("canvas");
canvas.width = 1;
canvas.height = 1;
var ctx = canvas.getContext("2d");
ctx.drawImage(vid, 0, 0, 1, 1);
var p = ctx.getImageData(0, 0, 1, 1).data;
//console.log("rgb(" + p[0] + "," + p[1] + "," + p[2] + ")");
if (isColorInRange(nativeColor, p)) {
vidBg.style.backgroundColor = "rgb(" + p[0] + "," + p[1] + "," + p[2] + ")";
}
}
}
}
function setVideoBgColorDelayed(vid, nativeColor) {
setTimeout(setVideoBgColor, 100, vid, nativeColor);
}
</script>
<style>
body {
margin: 0;
}
#my-video-bg {
height: 100vh;
display: flex;
align-items: center;
background-color: rgb(8,31,60);
}
#my-video {
max-width: 100%;
margin: 0 auto;
}
</style>
</head>
<body>
<div id="my-video-bg">
<video id="my-video" preload="metadata" onplay="setVideoBgColorDelayed(this,[8,31,60])" oncanplay="setVideoBgColorDelayed(this,[8,31,60])" controls>
<source src="video.mp4" type="video/mp4">
</video>
</div>
</body>
</html>
play
事件和setVideoBgColorDelayed
功能适用于Internet Explorer等浏览器,有时会触发canplay
事件,但{{1}尚未提供视频数据画布的功能。
如果在画布获取像素之前触发了drawImage
或isColorInRange
事件,则函数canplay
可以防止严重的背景更改。
重要的是,功能是在视频元素之前定义的。 如果您在文档末尾加载javascript,因为它通常是因为页面加载性能而建议的,那么该方法将无法正常工作。
答案 2 :(得分:3)
导出sRGB
或Adobe RGB
中的视频和图片可以解决此问题。我们有一个带有collor个人资料HD (1-1-1)
的视频,这导致Safari中的视频背景略微变淡,而不是Chrome。 在macOS上测试
答案 3 :(得分:0)
检查此工作demo。
将视频容器的背景颜色定义为#e1dcd8;
或用以下内容替换现有的css:
body, html {
height: 100%;
margin: 0;
padding: 0;
}
.background {
background-color: #e1dcd8;
width: 100%;
height: 100%;
}
.video-container{
background: #e1dcd8;
}
video {
margin-left: 5%;
margin-top: 5%;
}
答案 4 :(得分:0)
我觉得这里适当的解决方案是使用绿屏(你可能已经做过)拍摄并使用
可以在此处找到透明视频的示例: https://jakearchibald.com/scratch/alphavid/
答案 5 :(得分:0)
如果您的背景是纯黑色或白色,您只需在css中略微增加对比度,问题就会完全解决:
-webkit-filter: contrast(101%);
filter: contrast(101%);
来自Jack的原创想法。
答案 6 :(得分:0)
导出第二个视频,但仅将其限制为您在主视频中具有的背景色。因此,现在您有了原始视频,还有第二个视频,该视频长度为1秒,仅是纯色。
该视频标签应具有以下CSS:
#bg-video {
position: fixed;
width: 100vw;
z-index: -1;
}
,视频标签可以位于文档的顶部。
<body>
<video id="bg-video" src="assets/bg.mp4" muted></video>
<div>your main site html here</div>
</body>
由于两个视频的导出方式相同,因此颜色也应在多个浏览器和/或操作系统上呈现相同的颜色。
*请注意,您的“背景视频”应大致为正方形/矩形,以便在缩放时可以覆盖浏览器的宽度和高度。