HTML5 Video Boyutları


105

JavaScript içeren bir sayfaya üzerine bindirdiğim bir videonun boyutlarını almaya çalışıyorum, ancak video yüklenmeden önce hesaplandığı için gerçek video yerine poster görüntüsünün boyutlarını döndürüyor.


Vazgeçtin mi Burada cevaplar olarak iyi ipuçları var!
Juan Mendes

Yanıtlar:


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


Videonun bu tür meta verileri içereceğini düşünmediğim için bu, ogg formatında mümkün mü?
Elliot

@Elliot Bu demoda Chrome'da test ettim: people.opera.com/howcome/2007/video/controls.html ve çalışıyor ...
Šime Vidas

Görünüşe göre bağlantı tekrar koptu
Martin Delille

Maalesef bağlantı aslında bozuk değil
Martin Delille

137

VideoWidth ve videoHeight özellikleri "loadmetadata" olayı tetiklenene kadar ayarlanmadığından, yukarıda Sime Vidas tarafından şu anda kabul edilen çözümün aslında modern tarayıcılarda çalışmadığı unutulmamalıdır.

VIDEO öğesi oluşturulduktan sonra bu özellikler için yeterince sorgulama yaparsanız, bazen işe yarayabilir, ancak çoğu durumda bu, her iki özellik için de 0 değerlerini döndürür.

Doğru emlak değerlerini aldığınızı garanti etmek için şu satırlar boyunca bir şeyler yapmanız gerekir:

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

NOT: Bu tarayıcının 9 öncesi sürümleri HTML5 videoyu desteklemediğinden, addEventListener yerine attachEvent kullanan Internet Explorer'ın 9 öncesi sürümlerinin muhasebesini yapmakla uğraşmadım.


Hem genişlik hem de yükseklik için 100 değerleri alıyorum ve videoda 100px yok. Emin değilim neden ...
Mikel

2
Bu maalesef Android 49 için Chrome'da çalışmıyor; yalnızca video oynatılmaya başladığında bilgi kullanılabilir hale gelir. Bununla ilgili daha fazla bilgi var mı? PS1: Bunu yalnızca bir dosya seçici giriş öğesi kullanılarak seçilen yerel dosyaların URL'leriyle denedim. PS2: iOS Safari'de çalışıyor.
Visionscaper

Bu sorunu chromium bug tracker'da
Visionscaper

2
Bu çoğu zaman işe yaramayacaktır. Nadir durumlarda videoWidth ve videoHeight, loadedmetadatayangın çıktığında sıfır olur . Az önce Chromium 69'da gördüm. Dinlemek loadeddatadaha güvenli bir bahis.
2018

18

Kullanıma hazır fonksiyon

Belgedeki hiçbir şeyi değiştirmeden videonun boyutlarını eşzamansız olarak döndüren kullanıma hazır bir işlev .

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

Görmek isterseniz, pasaj için kullanılan video: Big Buck Bunny


Video etiket verilerini eşzamansız olarak sunma vaadinin harika kullanımı, tam da aradığım şey teşekkür
Ray Andison

Harika kod ve iyi bir tarayıcı desteği var: Chrome 32, Opera 19, Firefox 29, Safari 8 ve Microsoft Edge'den itibaren, vaatler varsayılan olarak etkindir.
Jeff Clayton

13

loadedmetadataKullanıcı aracısı medya kaynağının süresini ve boyutlarını henüz belirlediğinde gönderilen olayı dinleyin

Bölüm 4.7.10.16 Olay özeti

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

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

Doğru bağlantı: w3.org/TR/html5/…
Visionscaper

1
@Visionscaper Düzeltildi, teşekkürler. Orijinal niyetini değiştirmediklerinde, başkalarının cevaplarında küçük düzenlemeler yapmaktan çekinmeyin.
Juan Mendes

Donwvoter: Bunun iyileştirilebilmesi için bir açıklama yapmaktan memnun olurum!
Juan Mendes

1

Vue'da şu şekilde yapılabilir:

<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

Vuejs'de aşağıdaki kodu takılı etikette kullanıyorum.

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
    },
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.