获取真正的 HTML5 视频宽度和高度

Posted

技术标签:

【中文标题】获取真正的 HTML5 视频宽度和高度【英文标题】:Getting the real HTML5 video width and height 【发布时间】:2013-06-08 01:02:23 【问题描述】:

我有一个视频元素:

var video = window.content.document.createElement("video");
video.width = width;
video.height = height; 
video.style.backgroundColor = "black";
window.content.document.body.appendChild(video);

我正在通过 Firefox 上的 getUserMedia() 检索它的源代码:

window.navigator.getMedia = ( window.navigator.getUserMedia || window.navigator.webkitGetUserMedia || window.navigator.mozGetUserMedia || window.navigator.msGetUserMedia);

window.navigator.getMedia( //constraints, sucessCallback, errorCallback
    video: true, audio: false,
    function(stream) 
        if (window.navigator.mozGetUserMedia) 
            video.mozSrcObject = stream;
        else 
        
            var vendorURL = window.URL || window.webkitURL;
            video.src = vendorURL.createObjectURL(stream);
        
        video.play();
    ,
    function(err) 
        console.log("Error: " + err);
    
);

问题是我需要知道视频的“活动区域”,它返回给我 0:

video.onloadedmetadata = function()

    console.log(this.width + "x" +this.height); 
    console.log(this.videoWidth + "x" +this.videoHeight);

那么,如何检索 REAL 值?:

【问题讨论】:

当我使用 FF 运行您的代码时,this.width 和 this.height 返回视频元素的实际尺寸。只是为了测试,我将 video.width 和 video.height 设置为 400,第一条控制台行返回 400x400。 【参考方案1】:

这里有两个问题:

    video.videoWidthvideo.videoHeight 属性不会在 loadedmetadata 事件触发后立即设置。这是 bug in FireFox,现在已修复(感谢 @Martin Ekblom 指出错误)。 视频本身并没有占据视频元素的整个区域,似乎没有一个答案能够解决这个问题。相反,它会缩放以适应元素内部。

我认为没有直接的方法来获取活动区域的尺寸,但是在我自己解决了这个问题之后,我写了一个解决方案来根据我们知道的值来计算它:

function videoDimensions(video) 
  // Ratio of the video's intrisic dimensions
  var videoRatio = video.videoWidth / video.videoHeight;
  // The width and height of the video element
  var width = video.offsetWidth, height = video.offsetHeight;
  // The ratio of the element's width to its height
  var elementRatio = width/height;
  // If the video element is short and wide
  if(elementRatio > videoRatio) width = height * videoRatio;
  // It must be tall and thin, or exactly equal to the original ratio
  else height = width / videoRatio;
  return 
    width: width,
    height: height
  ;

本质上,我们获取视频元素的纵横比、视频的纵横比和视频元素的尺寸,并使用它们来确定视频占据的区域。

这假设视频的拟合方法没有通过 CSS 修改(不确定目前是否可行,但规范允许)。有关这方面和其他一些事情的更多详细信息,请参阅我写的博客文章 ("Finding the true dimensions of an html5 video’s active area"),灵感来自这个问题及其缺乏完整的答案。

有趣的是,虽然规范特别提到了视频周围可能存在的边缘(信箱和邮筒),但除了您的问题之外,我找不到任何其他提及。

【讨论】:

我认为这在 FireFox Developers 版本 51.0a2 中没有得到修复。在加载元数据事件触发后,我会以 640 x 480 为我报告 videoWidth/videoHeight,在我的情况下这是错误的。 @smatthews1999 视频是从带有<video> 标签的文件加载的,还是从getUserMedia 加载的? @Natewami getUserMedia。我能够使用视频元素的 clientWidth 和 clientHeight。 @Nateowami 你的网站已经死了。对于其他所有人,您可以在此处阅读他的博客文章:nathanielpaulus.wordpress.com/2016/09/04/… @Yay295 是的,很抱歉。感谢张贴的链接。我需要把它修好。当我无意中删除服务器时,它崩溃了。【参考方案2】:

您应该在视频中添加一个loadeddata 事件监听器,然后尝试读取大小,此时有关流的足够信息已被解码并且可以准确确定尺寸。

不过,在某些情况下,有时需要一些时间才能准备好尺寸,因此您可能需要尝试多次(有延迟)直到它起作用。

这可能就是为什么它对你不起作用,但对 Sam 起作用。

以下是我在 gumhelper 库中检查视频大小的方法,如果需要,可以尝试多次: https://github.com/sole/gumhelper/blob/master/gumhelper.js#L38

请注意我们是如何尝试多次的,如果它不起作用,我们会“放弃”并默认为 640x480。

【讨论】:

我遇到了同样的问题,然后从 loadedmetadata 更改为 loadeddata 并且它起作用了。谢谢!【参考方案3】:

"loadeddata" 应该只触发一次。最好使用“timeupdate”反复检查是否设置了视频的宽度和高度,尤其是使用 getUserMedia 时,您不会真正暂停视频,而是直接进入播放。

【讨论】:

【参考方案4】:

实际上这似乎是FF中的一个错误: https://bugzilla.mozilla.org/show_bug.cgi?id=926753

【讨论】:

看起来这个错误已在 FireFox 37(当前版本为 48)中修复。

以上是关于获取真正的 HTML5 视频宽度和高度的主要内容,如果未能解决你的问题,请参考以下文章

Jquery如何获取浏览器窗口宽度?

客户端Javascript在上传前获取视频宽度/高度

HTML5 <video> 宽度和高度

如何获取 HTML5 画布的宽度和高度?

html5(非直播)真正的流媒体/VOD

如何在 HTML5 Canvas 中获取绘制弧的宽度和高度?