web-dev-qa-db-fra.com

Dimensions vidéo HTML5

J'essaie d'obtenir les dimensions d'une vidéo que je superpose sur une page avec JavaScript. Toutefois, elle renvoie les dimensions de l'image de l'affiche au lieu de la vidéo réelle, car elle semble avoir été calculée avant le chargement de la vidéo.

82
Elliot
<video id="foo" src="foo.mp4"></video>

var vid = document.getElementById("foo");
vid.videoHeight; // returns the intrinsic height of the video
vid.videoWidth; // returns the intrinsic width of the video

Spec: https://html.spec.whatwg.org/multipage/embedded-content.html#the-video-element

79
Šime Vidas

Il convient de noter que la solution actuellement acceptée ci-dessus par Sime Vidas ne fonctionne pas dans les navigateurs modernes, car les propriétés videoWidth et videoHeight ne sont définies qu'après le déclenchement de l'événement "loadingmetadata".

Si vous interrogez suffisamment ces propriétés après le rendu de l'élément VIDEO, cela peut parfois fonctionner, mais dans la plupart des cas, cela renvoie la valeur 0 pour les deux propriétés.

Pour garantir que vous obtenez les valeurs de propriété correctes, vous devez procéder comme suit:

var v = document.getElementById("myVideo");
v.addEventListener( "loadedmetadata", function (e) {
    var width = this.videoWidth,
        height = this.videoHeight;
}, false );

REMARQUE: je n'ai pas pris la peine de comptabiliser les versions antérieures à 9 d'Internet Explorer qui utilisent attachEvent au lieu de addEventListener, car les versions antérieures à 9 de ce navigateur ne prennent pas en charge la vidéo HTML5.

119
natlee75

Fonction prête à l'emploi

Voici une fonction prête à l'emploi qui renvoie les dimensions d'une vidéo de manière asynchrone, sans rien changer dans le document .

// ---- Definitions ----- //

/**
 Returns the dimensions of a video asynchrounsly.
 @param {String} url Url of the video to get dimensions from.
 @return {Promise} Promise which returns the dimensions of the video in 'width' and 'height' properties.
 */
function getVideoDimensionsOf(url){
        return new Promise(function(resolve){
                // create the video element
                let video = document.createElement('video');

                // place a listener on it
                video.addEventListener( "loadedmetadata", function () {
                        // retrieve dimensions
                        let height = this.videoHeight;
                        let width = this.videoWidth;
                        // send back result
                        resolve({
                                height : height,
                                width : width
                        });
                }, false );

                // start download meta-datas
                video.src = url;
        });
}


// ---- Use ---- //
getVideoDimensionsOf("http://clips.vorwaerts-gmbh.de/VfE_html5.mp4")
   .then(({width, height}) => {
        console.log("Video width: " + width) ;
        console.log("Video height: " + height) ;
    });

Voici la vidéo utilisée pour l'extrait si vous souhaitez le voir: Big Buck Bunny

14
Yairopro

Écoutez l'événement loadedmetadata qui est distribué lorsque l'agent utilisateur vient de déterminer la durée et les dimensions de la ressource multimédia.

Section 4.7.10.16 Résumé de l'événement

https://www.w3.org/TR/html5/semantics-embedded-content.html#eventdef-media-loadedmetadata

videoTagRef.addEventListener('loadedmetadata', function(e){
    console.log(videoTagRef.videoWidth, videoTagRef.videoHeight);
});
12
Juan Mendes