La véritable vidéo HTML5 de largeur et de hauteur
J'ai un élément de vidéo:
var video = window.content.document.createElement("video");
video.width = width;
video.height = height;
video.style.backgroundColor = "black";
window.content.document.body.appendChild(video);
Et je suis de la récupération de la source via getUserMedia() sur Firefox:
window.navigator.getMedia = ( window.navigator.getUserMedia || window.navigator.webkitGetUserMedia || window.navigator.mozGetUserMedia || window.navigator.msGetUserMedia);
window.navigator.getMedia( //constraints, sucessCallback, errorCallback
{video: true, audio: false},
function(stream) {
if (window.navigator.mozGetUserMedia)
video.mozSrcObject = stream;
else
{
var vendorURL = window.URL || window.webkitURL;
video.src = vendorURL.createObjectURL(stream);
}
video.play();
},
function(err) {
console.log("Error: " + err);
}
);
Le problème est que j'ai besoin de connaître la "zone active" de la vidéo, et c'est le retour de moi 0:
video.onloadedmetadata = function(){
console.log(this.width + "x" +this.height);
console.log(this.videoWidth + "x" +this.videoHeight);
}
Alors, comment puis-je récupérer les valeurs RÉELLES?:
- Quand je suis en cours d'exécution de votre code à l'aide de FF, ce.la largeur et la ce.hauteur de retourner les dimensions réelles de l'élément vidéo. Juste pour tester j'ai mis la vidéo.la largeur et la vidéo.hauteur égale à 400 et la première console de ligne retourné 400x400.
Vous devez vous connecter pour publier un commentaire.
Il y a deux problèmes ici:
video.videoWidth
etvideo.videoHeight
propriétés n'étaient pas fixée dès que laloadedmetadata
événement déclenché. C'était un bug dans FireFox, qui est maintenant résolu (merci à @Martin Ekblom d'avoir signalé le bug).Je ne pense pas qu'il y a un moyen direct d'obtenir les dimensions de la zone active, mais après avoir lutté avec moi-même, j'ai préparé une solution pour le calculer à partir des valeurs que nous savons:
Essentiellement, nous prenons le ratio d'aspect de la vidéo de l'élément, le ratio d'aspect de la vidéo, et les dimensions de l'élément vidéo, et utilisez-les pour déterminer la zone de la vidéo occupe.
Cela suppose la vidéo de la méthode de l'ajustement n'a pas été modifiée via CSS (pas sûr si c'est encore possible à ce moment, mais la spec le permet). Pour plus de détails sur cela, et quelques autres choses, voir le billet de blog que j'ai écrit ("Trouver les véritables dimensions de la vidéo HTML5 zone active"), inspiré par cette question, et son manque de réponses complètes.
Il est intéressant de noter que, bien que la spec mentionne expressément la possible bords autour d'une vidéo (bandes noires et pillarboxing), je n'ai pas pu trouver d'autres mentions, à l'exception de votre question.
<video>
tag, ou est-il degetUserMedia
?Vous devez ajouter un
loadeddata
écouteur d'événement pour la vidéo, et essayer de lire la taille, ce qui n'est quand assez d'informations sur les flux a été décodé et les dimensions peuvent être déterminés avec précision.Encore, il faut parfois attendre un peu, dans certains cas, pour obtenir les dimensions prêt, de sorte que vous voudrez peut-être essayer plusieurs fois (avec retard) jusqu'à ce que cela fonctionne.
Qui explique peut-être pourquoi il ne fonctionne pas pour vous, mais il travaille pour Sam.
Voici comment j'ai vérifier la taille de la vidéo, avec plusieurs tentatives, si nécessaire, dans mon gumhelper de la bibliothèque:
https://github.com/sole/gumhelper/blob/master/gumhelper.js#L38
Remarquez comment nous avons essayer plusieurs fois et si ça ne fonctionne pas de nous "donner" et par défaut à 640x480.
loadeddata
deloadedmetadata
et cela a fonctionné. Merci!"loadeddata se" doit se déclencher une seule fois. Il est préférable d'utiliser des "timeupdate" à plusieurs reprises vérifier si la vidéo la largeur et la hauteur ont été fixés, en particulier avec getUserMedia où vous n'avez pas vraiment mettre la vidéo en pause, mais aller directement dans la lecture.
En fait, ce qui semble être un bug dans FF:
https://bugzilla.mozilla.org/show_bug.cgi?id=926753