J'ai une vidéo que le client veut s'asseoir "de manière transparente" sur le site. La couleur HEX d'arrière-plan de la vidéo correspond à la couleur d'arrière-plan HEX du site Web et s'affiche telle quelle dans certains navigateurs, dans certaines versions, parfois.
Le plus curieux, c'est que Chrome rend l'arrière-plan de la vidéo différemment, jusqu'à ce que vous ouvriez le sélecteur de couleur. Puis ils correspondent tout à coup. Pour être clair, cela ne se corrige que lorsque j'ouvre le sélecteur de couleur, pas le débogueur (lisez: ceci n'est pas un problème de repeinte).
Firefox affiche le rendu différemment lorsque je navigue pour la première fois sur le site, mais si je tape sur cmd + r, cela devient parfaitement transparent.
Regardez les captures d'écran - elles en disent plus que moi avec des mots.
Je suis en train de convaincre le client de passer à un fond blanc pour la vidéo, car cela "le réparera" certainement, mais je suis vraiment curieux de savoir ce qui se passe et pourquoi.
Avez-vous des idées de vos magiciens?
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>
Il semble que cela puisse être fondamental pour la manière dont les navigateurs rendent la vidéo, et non un correctif CSS/HTML simple. Votre question ressemble à cette question . Je parie que la réponse réside dans une combinaison de moteurs de rendu et de différences d'espace colorimétrique, ce qui peut signifier qu'il n'y a pas de moyen efficace de le résoudre sur les navigateurs.
Sur Firefox, vous pouvez essayer de manipuler les paramètres de gestion des couleurs pour voir si cela change le comportement. Cela ne résoudra pas le problème, mais cela pourrait aider à l'expliquer. Dans l'URL/barre de recherche, entrez "about: config". Cela devrait vous mener à une page d’options. Une autre barre de recherche apparaîtra dans la page, entrez "gfx.color_management.mode". Cette option peut prendre des valeurs 0,1,2. Essayez de les changer et de recharger la page (il peut être nécessaire de redémarrer Firefox) pour voir si vous pouvez obtenir une différence cohérente. Il est toutefois possible que cela ne fasse aucune différence si la couleur n'est pas gérée en premier lieu.
De même, vous pouvez essayer de désactiver le décodage vidéo à accélération matérielle en chrome. Entrez "chrome: // flags" dans l'URL/barre de recherche de chrome, puis recherchez le drapeau "Désactiver le décodage vidéo à accélération matérielle". Modifiez la valeur, redémarrez chrome et vérifiez à nouveau les couleurs.
Je me rends compte que ni l'une ni l'autre de ces solutions ne servaient de commentaire, mais je n'ai pas encore de représentant pour le moment.
Le problème ne dépend pas uniquement du navigateur, mais du rendu. Dès que le navigateur rend la vidéo avec une accélération matérielle, les préférences du processeur graphique affectent la couleur.
Par exemple, si vous utilisez une carte graphique Nvidia, vous pouvez modifier les préférences de couleur dans le Panneau de configuration Nvidia. Les moniteurs de bureau utilisent généralement la plage RVB complète de 0 à 255 , mais vous pouvez également configurer la plage RVB limitée de 16 à 235 . La gamme limitée est généralement utilisée par les téléviseurs.
D'une part, les pilotes de carte graphique définissent parfois la plage de couleurs des moniteurs de bureau sur la plage RVB limitée. D'un autre côté, les utilisateurs peuvent modifier cette valeur eux-mêmes… .. Étant donné que vous ne pouvez pas influencer les paramètres du navigateur de l'utilisateur ni les paramètres du pilote de la carte graphique, il y aura toujours des différences pour des utilisateurs distincts.
Full RGB range -> limited RGB range
#000000 becomes #161616
#081F3C becomes #172A43
#FFFFFF becomes #EBEBEB
Je l'ai testé avec Chrome, Chrome sur Smartphone, Edge, Firefox et Internet Explorer 11.
Dès que la vidéo est prête à être lue ou lue, vérifiez le premier pixel de la vidéo et modifiez la couleur d'arrière-plan du conteneur environnant en conséquence. Cela fonctionnera quels que soient les paramètres du navigateur et la configuration du rendu.
C'est le code:
<!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>
L'événement play
et la fonction setVideoBgColorDelayed
sont destinés à des navigateurs tels qu'Internet Explorer, qui déclenchent parfois déjà l'événement canplay
, bien que les données vidéo ne soient pas encore disponibles pour la fonction drawImage
de la grille.
La fonction isColorInRange
empêche les modifications d’arrière-plan brusques si les événements canplay
ou play
sont déclenchés avant que la grille ne puisse obtenir le pixel.
Il est important que les fonctions soient définies avant l'élément video . Si vous chargez le code javascript à la fin du document, comme cela est souvent suggéré en raison des performances de chargement de la page, l'approche ne fonctionnera pas.
L'exportation de vidéos et d'images dans sRGB
ou Adobe RGB
devrait résoudre ce problème. Nous avions une vidéo avec le profil de collor HD (1-1-1)
, ce qui atténuait légèrement l’arrière-plan vidéo dans Safari par rapport à Chrome. Testé sur macOS
Vérifiez que cela fonctionne demo .
Définissez la couleur d'arrière-plan du conteneur vidéo sous la forme # e1dcd8;
ou remplacez votre css existant par le suivant:
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%;
}
Je pense que la bonne solution est de filmer avec un écran vert (ce que vous avez probablement déjà fait) et d’utiliser
Un exemple de vidéo transparente peut être trouvé ici: https://jakearchibald.com/scratch/alphavid/
Si votre arrière-plan est noir ou blanc pur, vous pouvez simplement augmenter légèrement le contraste dans votre css et le problème sera entièrement résolu:
-webkit-filter: contrast(101%);
filter: contrast(101%);
Idée originale de Jack .
Exportez une seconde vidéo mais limitez-la uniquement à la couleur d'arrière-plan de votre vidéo principale. Alors maintenant, vous avez votre vidéo originale, et une seconde vidéo qui dure 1 seconde et est juste une couleur plate.
Cette balise video devrait avoir le css suivant:
#bg-video {
position: fixed;
width: 100vw;
z-index: -1;
}
et la balise video peut être en haut de votre document.
<body>
<video id="bg-video" src="assets/bg.mp4" muted></video>
<div>your main site html here</div>
</body>
Étant donné que les deux vidéos sont exportées de la même manière, les couleurs doivent également être rendues de la même manière sur plusieurs navigateurs et/ou systèmes d'exploitation.
* Notez que votre "vidéo d'arrière-plan" doit être plus ou moins un carré/rectangle afin que, lorsqu'elle est mise à l'échelle, elle couvre la largeur et la hauteur du navigateur.