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.


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


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.


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


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

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>

-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
    },
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.