Kích thước video HTML5


105

Tôi đang cố lấy kích thước của một video mà tôi đang phủ lên một trang bằng JavaScript, tuy nhiên, nó đang trả về kích thước của hình ảnh áp phích thay vì video thực vì có vẻ như nó đang được tính toán trước khi tải video.


Bạn đã từ bỏ? Có những manh mối tốt là câu trả lời ở đây!
Juan Mendes

Câu trả lời:


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

Thông số: https://html.spec.whatwg.org/multipage/embedded-content.html#the-video-element


Điều này có khả thi với định dạng ogg vì tôi không nghĩ video sẽ bao gồm siêu dữ liệu như vậy không?
Elliot

@Elliot Tôi đã thử nghiệm trong Chrome trên bản demo này: people.opera.com/howcome/2007/video/controls.html và nó hoạt động ...
Šime Vidas

Có vẻ như các liên kết bị phá vỡ một lần nữa
Martin Delille

Xin lỗi các liên kết không bị hỏng trong thực tế
Martin Delille

137

Cần lưu ý rằng giải pháp hiện được chấp nhận ở trên của Sime Vidas không thực sự hoạt động trong các trình duyệt hiện đại vì thuộc tính videoWidth và videoHeight không được đặt cho đến sau khi sự kiện "loadmetadata" được kích hoạt.

Nếu bạn tình cờ truy vấn các thuộc tính đó đủ xa sau khi phần tử VIDEO được hiển thị, đôi khi nó có thể hoạt động, nhưng trong hầu hết các trường hợp, điều này sẽ trả về giá trị 0 cho cả hai thuộc tính.

Để đảm bảo rằng bạn đang nhận được các giá trị thuộc tính chính xác, bạn cần làm điều gì đó dọc theo các dòng:

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

LƯU Ý: Tôi không bận tâm đến việc tính toán các phiên bản Internet Explorer trước 9 sử dụng AttachEvent thay vì addEventListener vì các phiên bản trước 9 của trình duyệt đó không hỗ trợ video HTML5.


Tôi nhận được các giá trị 100 cho cả chiều rộng và chiều cao và video không có 100px. Bạn không chắc chắn lý do tại sao ...
Mikel

2
Rất tiếc, tính năng này không hoạt động trên Chrome dành cho Android 49; chỉ khi video đã bắt đầu phát, thông tin mới có sẵn. Bất kỳ cái nhìn sâu sắc hơn về điều này? PS1: Tôi chỉ thử điều này với các URL đến tệp cục bộ được chọn bằng phần tử đầu vào của bộ chọn tệp. PS2: nó hoạt động trên iOS Safari.
Visionscaper

Tôi đã tạo sự cố này tại trình theo dõi lỗi crom: bug.chromium.org/p/chromium/issues/detail?id=598218
Visionscaper

2
Điều này sẽ không hoạt động 100% số lần. Trong những trường hợp hiếm hoi, videoWidth và videoHeight sẽ bằng 0 khi loadedmetadatakích hoạt. Tôi vừa thấy nó trên Chromium 69. Nghe cho loadeddatalà một cách đặt cược an toàn hơn.
khai mạc

18

Chức năng sẵn sàng sử dụng

Đây là một hàm sẵn sàng để sử dụng, trả về kích thước của video một cách không đồng bộ, mà không thay đổi bất kỳ điều gì trong tài liệu .

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

Đây là video được sử dụng cho đoạn mã nếu bạn muốn xem: Big Buck Bunny


Lớn sử dụng một lời hứa để cung cấp dữ liệu thẻ video không đồng bộ, chỉ là những gì tôi đang tìm kiếm nhờ
Ray Andison

Mã tuyệt vời và có hỗ trợ trình duyệt tốt: Kể từ Chrome 32, Opera 19, Firefox 29, Safari 8 và Microsoft Edge, hứa hẹn được bật theo mặc định.
Jeff Clayton

13

Lắng nghe loadedmetadatasự kiện được gửi đi khi tác nhân người dùng vừa xác định thời lượng và kích thước của tài nguyên phương tiện

Phần 4.7.10.16 Tóm tắt sự kiện

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

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

Liên kết chính xác: w3.org/TR/html5/…
Visionscaper

1
@Visionscaper Đã sửa, cảm ơn. Hãy thoải mái chỉnh sửa câu trả lời của người khác khi họ không thay đổi ý định ban đầu.
Juan Mendes

Donwvoter: Tôi đánh giá cao lời giải thích để điều này có thể được cải thiện!
Juan Mendes

1

Đây là cách nó có thể được thực hiện trong 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

Trong Vuejs, tôi sử dụng mã sau trong thẻ gắn kết.

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
    },
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.