Dimensi Video HTML5

105

Saya mencoba untuk mendapatkan dimensi video yang saya overlay ke halaman dengan JavaScript, namun itu mengembalikan dimensi gambar poster daripada video sebenarnya karena tampaknya dihitung sebelum video dimuat.

Elliot
sumber
Apakah kamu menyerah? Ada petunjuk bagus sebagai jawaban di sini!
Juan Mendes

Jawaban:

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

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

Šime Vidas
sumber
Apakah ini mungkin dengan format ogg karena menurut saya video tidak akan menyertakan metadata seperti itu?
Elliot
@Elliot Saya menguji di Chrome pada demo ini: people.opera.com/howcome/2007/video/controls.html dan berhasil ...
Šime Vidas
Tampaknya tautannya rusak lagi
Martin Delille
Maaf tautannya sebenarnya tidak rusak
Martin Delille
137

Perlu diperhatikan bahwa solusi yang saat ini diterima di atas oleh Sime Vidas tidak benar-benar berfungsi di browser modern karena properti videoWidth dan videoHeight tidak disetel hingga peristiwa "dimuatmetadata" diaktifkan.

Jika Anda kebetulan membuat kueri untuk properti tersebut cukup jauh setelah elemen VIDEO dirender, ini terkadang berfungsi, tetapi dalam banyak kasus ini akan mengembalikan nilai 0 untuk kedua properti.

Untuk menjamin bahwa Anda mendapatkan nilai properti yang benar, Anda perlu melakukan sesuatu di sepanjang baris:

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

CATATAN: Saya tidak repot menghitung versi Internet Explorer pra-9 yang menggunakan attachEvent alih-alih addEventListener karena versi pra-9 dari browser tersebut tidak mendukung video HTML5.

natlee75
sumber
Saya mendapatkan nilai 100 untuk lebar dan tinggi, dan video tidak memiliki 100 piksel. Tidak yakin mengapa ...
Mikel
2
Sayangnya ini tidak berfungsi di Chrome untuk Android 49; hanya ketika video sudah mulai diputar info menjadi tersedia. Ada wawasan lebih lanjut tentang ini? PS1: Saya hanya mencoba ini dengan URL ke file lokal yang dipilih menggunakan elemen input pemilih file. PS2: ini berfungsi di iOS Safari.
Visionscaper
Saya membuat masalah ini di pelacak bug chromium: bugs.chromium.org/p/chromium/issues/detail?id=598218
Visionscaper
2
Ini tidak akan berhasil 100%. Terkadang videoWidth dan videoHeight akan bernilai nol saat loadedmetadatadiaktifkan. Saya baru saja melihatnya di Chromium 69. Mendengarkan loadeddataadalah taruhan yang lebih aman.
cleong
18

Fungsi siap pakai

Berikut adalah fungsi siap pakai yang mengembalikan dimensi video secara asinkron, tanpa mengubah apa pun di dokumen .

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

Berikut video yang digunakan untuk cuplikan tersebut jika Anda ingin melihatnya: Big Buck Bunny

Yairopro
sumber
Penggunaan yang hebat dari janji untuk mengirimkan data tag video secara asinkron, persis seperti yang saya cari, terima kasih
Ray Andison
Kode hebat, dan memiliki dukungan browser yang layak: Pada Chrome 32, Opera 19, Firefox 29, Safari 8 & Microsoft Edge, janji diaktifkan secara default.
Jeff Clayton
13

Dengarkan loadedmetadataperistiwa yang dikirim ketika agen pengguna baru saja menentukan durasi dan dimensi sumber daya media

Bagian 4.7.10.16 Ringkasan acara

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

videoTagRef.addEventListener('loadedmetadata', function(e){
    console.log(videoTagRef.videoWidth, videoTagRef.videoHeight);
});
Juan Mendes
sumber
Tautan yang benar: w3.org/TR/html5/…
Visionscaper
1
@Visionscaper Fixed, terima kasih. Jangan ragu untuk mengedit jawaban orang lain jika mereka tidak mengubah maksud aslinya.
Juan Mendes
Donwvoter: Saya menghargai penjelasannya sehingga ini bisa diperbaiki!
Juan Mendes
1

Beginilah cara melakukannya di 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>
Ilyich
sumber
-1

Di Vuejs saya menggunakan kode berikut di tag yang dipasang.

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
    },
});
Aseem
sumber