HTML5 视频尺寸

IT技术 javascript jquery html5-video
2021-01-17 22:53:32

我正在尝试获取我正在使用 JavaScript 覆盖到页面上的视频的尺寸,但是它返回的是海报图像的尺寸而不是实际视频,因为它似乎是在加载视频之前计算出来的。

6个回答

应该注意的是,Sime Vidas 目前接受的解决方案实际上不适用于现代浏览器,因为 videoWidth 和 videoHeight 属性在“loadedmetadata”事件触发后才设置。

如果您碰巧在 VIDEO 元素呈现后查询这些属性足够远,它有时可能会起作用,但在大多数情况下,这将返回两个属性的值 0。

为了保证您获得正确的属性值,您需要执行以下操作:

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

注意:我没有考虑使用 attachEvent 而不是 addEventListener 的 9 之前版本的 Internet Explorer,因为该浏览器的 9 之前版本不支持 HTML5 视频。

我得到的宽度和高度的值都是 100,而视频没有 100px。不知道为什么...
2021-03-23 22:53:32
不幸的是,这不适用于 Android 49 的 Chrome;只有当视频开始播放时,信息才可用。对此有何进一步见解?PS1:我只尝试了使用文件选择器输入元素选择的本地文件的 URL。PS2:它确实适用于 iOS Safari。
2021-04-03 22:53:32
这不会在 100% 的情况下起作用。在极少数情况下,视频宽度和视频高度在loadedmetadata触发时为零我刚在 Chromium 69 上看到它。听loadeddata是一个更安全的赌注。
2021-04-03 22:53:32
我在铬错误跟踪器上创建了这个问题:bugs.chromium.org/p/chromium/issues/detail?id=598218
2021-04-13 22:53:32
<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

ogg 格式是否有可能,因为我认为视频不会包含此类元数据?
2021-03-17 22:53:32
@Elliot 我在 Chrome 中测试了这个演示:people.opera.com/howcome/2007/video/controls.html并且它有效......
2021-03-24 22:53:32
链接好像又断了
2021-03-27 22:53:32
播放本地文件时始终为零 URL.createObjectURL( file )
2021-03-31 22:53:32
抱歉,链接实际上并未断开
2021-04-02 22:53:32

即用型功能

这是一个随时可用的函数,它异步返回视频的尺寸,而不更改文档中的任何内容

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

如果您想看,这里是用于片段的视频:Big Buck Bunny

很棒的代码,并且有不错的浏览器支持:从 Chrome 32、Opera 19、Firefox 29、Safari 8 和 Microsoft Edge 开始,promises 是默认启用的。
2021-04-11 22:53:32
很好地使用了异步提供视频标签数据的Promise,正是我正在寻找的,谢谢
2021-04-12 22:53:32

监听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);
});
Donwvoter:我很感激解释,以便可以改进!
2021-03-20 22:53:32
正确链接:w3.org/TR/html5/...
2021-03-29 22:53:32
@Visionscaper 已修复,谢谢。在不改变初衷的情况下,随意对他人的答案进行小幅编辑。
2021-04-08 22:53:32

这就是它在 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>