HTML5 vidéo couleur de fond ne correspondant pas à la couleur de fond du site web - dans certains navigateurs, parfois

j'ai une vidéo que le client veut asseoir" sans couture " dans le site. La couleur HEX de fond de la vidéo correspond à la couleur HEX de fond du site web, et rend en tant que tel dans certains navigateurs, certaines versions, certains du temps?

ce qui est le plus curieux, C'est que le Chrome rend le fond de la vidéo différemment, jusqu'à ce que vous ouvrez le picker de couleur. Puis subitement le match. Pour être clair, il fixe seulement une fois que j'ouvre le sélecteur de couleurs, pas le débogueur (lire: ce n'est pas une question de repeindre).

Firefox rend différemment quand j'ai naviguer sur le site, mais si je frappe cmd+r, il devient parfaitement transparent.

regardez les screenshots - ils en disent plus que moi avec les mots.

je suis en train de convaincre le client de passer au fond blanc pour la vidéo car cela va certainement la" corriger", mais je suis super curieux de savoir ce qui /pourquoi cela se produit.

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>

Screenshots of the different browsers.

20
demandé sur tayvano 2016-02-05 04:44:20

6 réponses

il semble comme il pourrait être fondamental à la façon dont les navigateurs rendent la vidéo, et pas un CSS/HTML facile correction. Votre question ressemble à cette question . Je parie que la réponse réside dans une combinaison de moteurs de rendu et de différences de coloris, ce qui peut signifier qu'il n'y a pas de bonne façon de le corriger à travers les navigateurs.

sur firefox, vous pouvez essayer de jouer avec les paramètres de gestion des couleurs pour voir si cela change le comportement. Cela ne résout pas le problème, mais cela pourrait aider à expliquer. Dans la barre de recherche/URL, entrez "about: config". Il devrait vous conduire à une page d'options. Une autre barre de recherche apparaîtra rendue dans la page, entrez "gfx.color_management.mode." Cette option peut prendre des valeurs 0,1,2. Essayez de les commuter et de recharger la page (peut-être besoin de redémarrer firefox) pour voir si vous pouvez obtenir une différence cohérente. Il est possible qu'il ne fera aucune différence si la couleur n'est pas géré en premier lieu.

De la même façon, vous pouvez essayer de désactiver le matériel de décodage vidéo accéléré dans chrome. Entrez "chrome: / / flags" dans la barre de recherche / URL de chrome, puis trouvez le drapeau "Matériel désactivé-décodage Vidéo Accéléré". Changez quelle que soit la valeur, redémarrez chrome, et vérifiez les couleurs à nouveau.

ce ne sont pas des solutions que je me rends compte, cela a peut-être été mieux servi comme commentaire, mais je n'ai pas encore le représentant pour cela.

7
répondu Jeremy Watson 2017-05-23 12:10:16

la question n'est pas uniquement dépendante du navigateur, mais rend dépendante. Dès que le navigateur affiche la vidéo avec une accélération matérielle, les préférences GPU 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 Contrôle Nvidia. Les moniteurs de bureau utilisent généralement la gamme complète de RVB de 0 à 255 , mais vous pouvez également configurer la gamme limitée de RVB de 16 à 235 . La portée limitée est généralement utilisée par les téléviseurs.

d'une part, les pilotes de carte graphique par défaut parfois la gamme de couleurs des moniteurs de bureau à la gamme RGB limitée. D'un autre côté, les utilisateurs peuvent changer cette valeur eux-mêmes. Puisque vous ne pouvez pas influencer les paramètres du navigateur de l'utilisateur ni les paramètres du pilote de carte graphique, il y aura toujours des différences pour les utilisateurs distincts.

comment sont les couleurs affectées:

Full RGB range -> limited RGB range
#000000 becomes #161616
#081F3C becomes #172A43
#FFFFFF becomes #EBEBEB

Voici mon approche pour résoudre ce problème:

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 jouée ou reprise, vérifiez le premier pixel de la vidéo et changez la couleur de fond du conteneur environnant en conséquence. Cela fonctionne indépendamment des paramètres du navigateur et de 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 pour les navigateurs comme Internet Explorer, qui parfois tirent déjà l'événement canplay , bien que les données vidéo ne sont pas encore disponibles à la fonction drawImage de la toile.

la fonction isColorInRange empêche les changements de fond difficiles, si les événements canplay ou play sont tirés avant que la toile puisse obtenir le pixel.

il est important, que les fonctions sont définies avant l'élément vidéo. Si vous chargez le javascript à la fin du document, comme il est souvent suggéré en raison de la performance de chargement de la page, alors l'approche ne fonctionnera pas.

6
répondu feng 2017-06-13 13:55:52

exporter des vidéos et des images dans sRGB ou Adobe RGB devrait résoudre ce problème. Nous avons eu une vidéo avec le profil de collor HD (1-1-1) , et cela a causé arrière-plan vidéo d'être légèrement plus léger en Safari que dans Chrome. testé sur macOS

3
répondu Mladen Janjetovic 2017-02-28 10:25:46

Check ce travail démo .

définit la couleur de fond pour le conteneur vidéo comme # e1dcd8;

ou remplacer votre NSC existant par ce qui suit:

 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%;
}
0
répondu Arun Sharma 2016-02-08 10:27:08

je pense que la bonne solution ici est de filmer en utilisant un écran vert (ce que vous avez probablement déjà fait) et utiliser

  1. transparent webm video or
  2. remplacer les pixels verts par des pixels transparents en utilisant javascript canvas

un exemple de vidéo transparente peut être trouvé ici: https://jakearchibald.com/scratch/alphavid/

0
répondu Thomas 2017-06-14 10:53:43

si votre fond est pur noir ou blanc, 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 .

0
répondu David 2018-05-10 19:11:39