Параметри відео HTML5


105

Я намагаюся отримати розміри відео, яке я накладаю на сторінку з JavaScript, однак воно повертає розміри зображення плаката замість фактичного відео, оскільки, здається, воно обчислюється до завантаження відео.


Ви здалися? Тут є хороші підказки як відповіді!
Хуан Мендес

Відповіді:


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


Чи можливо це за допомогою формату ogg, оскільки я не думаю, що відео буде включати такі метадані?
Елліот

@Elliot Я протестував у Chrome на цій демонстрації: people.opera.com/howcome/2007/video/controls.html, і це працює ...
Šime Vidas

Здається, зв’язок знову розірваний
Мартін Деллі

Вибачте, посилання насправді не порушено
Мартін Деллі

137

Слід зазначити, що прийняте в даний час рішення Sime Vidas насправді не працює в сучасних браузерах, оскільки властивості videoWidth та videoHeight не встановлюються до завершення події "завантажених даних".

Якщо у вас виникає запит на ці властивості досить далеко після надання елемента VIDEO, він іноді може працювати, але в більшості випадків це поверне значення 0 для обох властивостей.

Щоб гарантувати отримання правильних значень властивостей, потрібно зробити щось відповідно до:

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

ПРИМІТКА: Я не турбував облік попередніх 9 версій Internet Explorer, які використовують attachEvent замість addEventListener, оскільки версії браузера попереднього віку 9 не підтримують HTML5 відео.


Я отримую значення 100 як для ширини, так і для висоти, а відео не має 100 пікселів. Не впевнений, чому ...
Мікель

2
На жаль, це не працює на Chrome для Android 49; лише тоді, коли відео почалося відтворення, інформація стає доступною. Будь-яке подальше розуміння щодо цього? PS1: Я спробував це лише з URL-адресами до локальних файлів, вибраних за допомогою вхідного елемента вибору файлів. PS2: він працює на iOS Safari.
Visionscaper

Я створив цю проблему за допомогою хромової помилки: bugs.chromium.org/p/chromium/isissue/detail?id=598218
Visionscaper

2
Це не спрацює у 100% разів. У рідкісних випадках відеоширина та відеовисота становлять нульові значення при loadedmetadataпожежах. Я щойно бачив це на Chromium 69. Прослуховування loadeddata- це більш безпечна ставка.
cleong

18

Готова до використання функція

Ось готова до використання функція, яка повертає розміри відео асинхронно, не змінюючи нічого в документі .

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

Ось відео, яке використовується для фрагмента, якщо ви хочете його переглянути: Big Buck Bunny


Прекрасне використання обіцянки асинхронно доставити дані відеотегів, саме те, чого я шукав, дякую
Рей Ендісон,

Чудовий код та пристойну підтримку браузера: Що стосується Chrome 32, Opera 19, Firefox 29, Safari 8 та Microsoft Edge, обіцянки включені за замовчуванням.
Джефф Клейтон

13

Прослухайте loadedmetadataподію, яка надсилається, коли агент користувача щойно визначив тривалість і розміри медіаресурсу

Розділ 4.7.10.16 Підсумок подій

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

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

Правильне посилання: w3.org/TR/html5/…
Visionscaper

1
@Visionscaper Виправлено, дякую. Не соромтеся робити невеликі редагування відповідей інших, коли вони не змінюють початкового наміру.
Хуан Мендес

Donwvoter: Я вдячний за пояснення, щоб це можна було покращити!
Хуан Мендес

1

Ось як це можна зробити у 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

У Vuejs я використовую наступний код у змонтованому тезі.

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
    },
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.