javascript - HTML5 videodimensjoner


Jeg prøver å få dimensjonene til en video som jeg legger over på en side med JavaScript, men den returnerer dimensjonene til forsidebildet i stedet for den faktiske videoen, ettersom det ser ut til at det blir beregnet før videoen er lastet.

Svar #1

Det bør bemerkes at den for øyeblikket aksepterte løsningen ovenfor av Sime Vidas faktisk ikke fungerer i moderne nettlesere siden videoWidth- og videoHeight-egenskapene ikke blir satt før etter at «loadedmetadata»-hendelsen har blitt utløst.

Hvis du tilfeldigvis etterspør disse egenskapene lenge nok etter at VIDEO-elementet er gjengitt, kan det noen ganger fungere, men i de fleste tilfeller vil dette returnere verdier på 0 for begge egenskapene.

For å garantere at du får de riktige egenskapsverdiene, må du gjøre noe i retning av:

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

MERK: Jeg brydde meg ikke om å ta høyde for versjoner av Internet Explorer før 9 som bruker attachEvent i stedet for addEventListener, siden versjoner før 9 av den nettleseren uansett ikke støtter HTML5-video.

Svar #2

<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

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

Svar #3

Klar-til-bruk-funksjon

Her er en klar til bruk-funksjon som returnerer dimensjonene til en video asynkront, uten å endre noe i dokumentet.

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

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

        // place a listener on it
        video.addEventListener( "loadedmetadata", function () {
            // retrieve dimensions
            const height = this.videoHeight;
            const width = this.videoWidth;

            // send back result
            resolve({height, width});
        }, false);

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


// ---- Use ---- //
getVideoDimensionsOf("https://www.w3schools.com/html/mov_bbb.mp4")
   .then(console.log);

Her er videoen som ble brukt for utdraget hvis du ønsker å se den: Big Buck Bunny

Svar #4

Lytt etter loadedmetadata-hendelsen som sendes når brukeragenten nettopp har fastslått varigheten og dimensjonene til medieressursen

Seksjon 4.7.10.16 Hendelsesoversikt

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

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

Relaterte artikler