【发布时间】:2011-05-06 23:00:28
【问题描述】:
我正在尝试获取使用 JavaScript 覆盖到页面上的视频的尺寸,但是它返回的是海报图像的尺寸,而不是实际视频,因为它似乎是在视频之前计算的已加载。
【问题讨论】:
-
你放弃了吗?这里有很好的线索作为答案!
标签: javascript jquery html5-video
我正在尝试获取使用 JavaScript 覆盖到页面上的视频的尺寸,但是它返回的是海报图像的尺寸,而不是实际视频,因为它似乎是在视频之前计算的已加载。
【问题讨论】:
标签: javascript jquery html5-video
应该注意的是,Sime Vidas 目前接受的上述解决方案实际上在现代浏览器中并不适用,因为直到触发“loadedmetadata”事件之后才会设置 videoWidth 和 videoHeight 属性。
如果您碰巧在呈现 VIDEO 元素之后查询这些属性足够远,它有时可能会起作用,但在大多数情况下,这两个属性都会返回 0 值。
为确保您获得正确的属性值,您需要执行以下操作:
var v = document.getElementById("myVideo");
v.addEventListener( "loadedmetadata", function (e) {
var width = this.videoWidth,
height = this.videoHeight;
}, false );
注意:我没有考虑使用 attachEvent 而不是 addEventListener 的 Internet Explorer 9 之前的版本,因为该浏览器的 9 之前的版本不支持 HTML5 视频。
【讨论】:
loadedmetadata 触发时 videoWidth 和 videoHeight 将为零。我刚刚在 Chromium 69 上看到它。收听 loadeddata 是一个更安全的选择。
<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
规格:https://html.spec.whatwg.org/multipage/embedded-content.html#the-video-element
【讨论】:
URL.createObjectURL( file )播放本地文件时总是为零
这是一个随时可用的函数,它异步返回视频的尺寸,不更改文档中的任何内容。
// ---- 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(resolve => {
// create the video element
const video = document.createElement('video');
// place a listener on it
video.addEventListener( "loadedmetadata", function () {
// retrieve dimensions
const height = this.videoHeight;
const width = this.videoWidth;
// send back result
resolve({height, width});
}, false );
// start download meta-datas
video.src = url;
});
}
// ---- Use ---- //
getVideoDimensionsOf("https://www.w3schools.com/html/mov_bbb.mp4")
.then(console.log);
如果你想看,这里是用于 sn-p 的视频:Big Buck Bunny
【讨论】:
侦听loadedmetadata 事件,当用户代理刚刚确定媒体资源的持续时间和尺寸时调度该事件
https://www.w3.org/TR/html5/semantics-embedded-content.html#eventdef-media-loadedmetadata
videoTagRef.addEventListener('loadedmetadata', function(e){
console.log(videoTagRef.videoWidth, videoTagRef.videoHeight);
});
【讨论】:
这就是在 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>
【讨论】:
这也应该注意
在某些情况下,例如HLS流
“onmetadataloaded”也不起作用。
在这些情况下,此解决方案非常完美。
var video = document.getElementById("video")
video.onplaying = function () {
var width = video.videoWidth
var height = video.videoHeight
console.log("video dimens loaded w="+width+" h="+height)
}
【讨论】:
在 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
},
});
【讨论】: