You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取HTML5 <video>元素中视频的渲染尺寸?

如何获取HTML5 <video>元素中视频的实际渲染尺寸?

问题背景

有人建议使用videoWidth和videoHeight属性,但这两个值返回的是视频内在的原始宽高,并非屏幕上实际渲染的像素尺寸。而直接读取video.width和video.height时,却返回0:

const video = document.querySelector("video");
console.log(video.width); // 0
console.log(video.height); // 0
<video src="https://upload.wikimedia.org/wikipedia/commons/4/48/Fine-tuned-Bee-Flower-Coevolutionary-State-Hidden-within-Multiple-Pollination-Interactions-srep03988-s6.ogv" controls></video>

后续尝试getBoundingClientRect()、clientWidth/clientHeight方法,发现它们返回的是<video>元素本身的尺寸,而非视频内容的实际渲染尺寸。例如将视频设为height:100%并放入1000px高的容器中,这些方法返回的是容器高度1000px,而非视频实际渲染的高度:

const video = document.querySelector("video");
video.addEventListener('loadedmetadata', () => {
  const rect = video.getBoundingClientRect();
  console.log(rect.height); // ~1000
  console.log(video.clientHeight); // 1000
});
#container {
  outline: 3px solid red;
  height: 1000px;
}

video {
  height: 100%;
  max-width: 100%;
}
<div id="container">
  <video src="https://upload.wikimedia.org/wikipedia/commons/4/48/Fine-tuned-Bee-Flower-Coevolutionary-State-Hidden-within-Multiple-Pollination-Interactions-srep03988-s6.ogv" controls></video>
</div>

解决方案

要获取视频内容的实际渲染尺寸,需结合视频的原始宽高比与<video>元素的显示空间,计算出视频保持比例缩放后的真实尺寸:

实现代码

function getVideoRenderedSize(video) {
  // 确保视频元数据已加载,能获取原始宽高
  if (!video.videoWidth || !video.videoHeight) {
    return { width: 0, height: 0 };
  }

  // 获取元素可用显示尺寸(排除内边距、边框)
  const elementWidth = video.clientWidth;
  const elementHeight = video.clientHeight;

  // 计算视频原始宽高比与元素宽高比
  const videoAspectRatio = video.videoWidth / video.videoHeight;
  const elementAspectRatio = elementWidth / elementHeight;

  let renderedWidth, renderedHeight;

  if (elementAspectRatio > videoAspectRatio) {
    // 元素更宽,视频高度填满元素,宽度按比例缩放
    renderedHeight = elementHeight;
    renderedWidth = renderedHeight * videoAspectRatio;
  } else {
    // 元素更高,视频宽度填满元素,高度按比例缩放
    renderedWidth = elementWidth;
    renderedHeight = renderedWidth / videoAspectRatio;
  }

  // 返回取整后的实际渲染像素尺寸
  return {
    width: Math.round(renderedWidth),
    height: Math.round(renderedHeight)
  };
}

// 使用示例
const video = document.querySelector("video");
video.addEventListener('loadedmetadata', () => {
  // 监听窗口/元素尺寸变化,实时更新渲染尺寸
  window.addEventListener('resize', () => {
    const size = getVideoRenderedSize(video);
    console.log('视频实际渲染尺寸:', size);
  });

  // 初始加载时计算一次
  const size = getVideoRenderedSize(video);
  console.log('视频实际渲染尺寸:', size);
});

说明

  • 该方法遵循视频保持原始宽高比的缩放规则,计算结果为视频内容在屏幕上实际占据的像素尺寸。
  • 若需处理动态尺寸变化(如窗口缩放、容器尺寸调整),需监听resize事件重新计算。

内容的提问来源于stack exchange,提问作者Michael Haddad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:17:16