Dimensioni video HTML5


105

Sto cercando di ottenere le dimensioni di un video di cui sto sovrapponendo una pagina con JavaScript, tuttavia restituisce le dimensioni dell'immagine del poster invece del video effettivo poiché sembra che venga calcolato prima del caricamento del video.


Ti sei arreso? Ci sono buoni indizi come risposte qui!
Juan Mendes

Risposte:


105
<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

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


È possibile con il formato ogg perché non credo che il video includerà tali metadati?
Elliot

@Elliot Ho provato in Chrome in questa demo: people.opera.com/howcome/2007/video/controls.html e funziona ...
Šime Vidas

Sembra che il collegamento si rompa di nuovo
Martin Delille

Spiacenti, il collegamento non è interrotto infatti
Martin Delille

137

Va notato che la soluzione attualmente accettata sopra da Sime Vidas in realtà non funziona nei browser moderni poiché le proprietà videoWidth e videoHeight non vengono impostate fino a quando non è stato attivato l'evento "loadmetadata".

Se ti capita di eseguire una query per quelle proprietà abbastanza lontano dopo che l'elemento VIDEO è stato reso, a volte potrebbe funzionare, ma nella maggior parte dei casi restituirà valori di 0 per entrambe le proprietà.

Per garantire che stai ottenendo i valori di proprietà corretti, devi fare qualcosa sulla falsariga di:

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

NOTA: non mi sono preoccupato di tenere conto delle versioni precedenti alla 9 di Internet Explorer che utilizzano attachEvent invece di addEventListener poiché le versioni precedenti alla 9 di quel browser non supportano il video HTML5, comunque.


Ricevo valori di 100 sia per la larghezza che per l'altezza e il video non ha 100 px. Non so perché ...
Mikel

2
Purtroppo non funziona su Chrome per Android 49; solo quando il video ha iniziato la riproduzione le informazioni diventano disponibili. Qualche ulteriore intuizione su questo? PS1: l'ho provato solo con URL di file locali selezionati utilizzando un elemento di input del selettore di file. PS2: funziona su iOS Safari.
Visionscaper

Ho creato questo problema nel bug tracker di chromium
Visionscaper

2
Questo non funzionerà il 100% delle volte. In rare occasioni videoWidth e videoHeight saranno zero quando vengono attivati loadedmetadata. L'ho appena visto su Chromium 69. Ascoltare loadeddataè una scommessa più sicura.
Cleong

18

Funzione pronta all'uso

Ecco una funzione pronta per l'uso che restituisce le dimensioni di un video in modo asincrono, senza modificare nulla nel documento .

// ---- 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) ;
    });

Ecco il video utilizzato per lo snippet se desideri vederlo: Big Buck Bunny


Ottimo uso della promessa di fornire i dati dei tag video in modo asincrono, proprio quello che stavo cercando, grazie
Ray Andison

Ottimo codice e supporto browser decente: a partire da Chrome 32, Opera 19, Firefox 29, Safari 8 e Microsoft Edge, le promesse sono abilitate per impostazione predefinita.
Jeff Clayton

13

Ascolta l' loadedmetadataevento che viene inviato quando il programma utente ha appena determinato la durata e le dimensioni della risorsa multimediale

Sezione 4.7.10.16 Riepilogo evento

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

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


1
@Visionscaper Fixed, grazie. Sentiti libero di apportare piccole modifiche alle risposte degli altri quando non cambiano l'intenzione originale.
Juan Mendes,

Donwvoter: Apprezzerei una spiegazione in modo che possa essere migliorata!
Juan Mendes

1

Ecco come può essere fatto in Vue:

<template>
    <div>
        <video src="video.mp4" @loadedmetadata="getVideoDimensions"></video>
    </div>
</template>

<script>
export default {
    methods: {
        getVideoDimensions (e) {
            console.log(e.target.videoHeight)
            console.log(e.target.videoWidth)
        }
    }
}
</script>

-1

In Vuejs utilizzo il seguente codice nel tag montato.

var app = new Vue({
    el: '#id_homepage',
    mounted: function () {
        var v = document.getElementById("id_video");
        var width = v.offsetWidth;
        v.height = Math.floor(width*(9/16)); // dynamically setting video height to maintain aspect ratio
    },
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.