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

Posted

技术标签:

【中文标题】客户端Javascript在上传前获取视频宽度/高度【英文标题】:Client side Javascript get video width/height before upload 【发布时间】:2017-09-03 14:54:47 【问题描述】:

我一直在尝试将 html5 视频标签 + FileReader API 组合在一起,但我还没有弄清楚如何获取用户从他们自己的计算机提供的视频的尺寸。

这是我所引用的宽度/高度:

HTML5 Video Dimensions

<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

但我想知道是否可以使用来自用户计算机的文件(他们通过普通输入 html 标记选择的文件)来执行此操作。

谢谢!

【问题讨论】:

File 实例不公开底层文件内容的内容,在 .type 属性、.size.lastModified.lastModifiedDate 处保存 MIME 类型。您可以创建一个&lt;video&gt; 元素,将.src 设置为Blob URLdata URI 表示文件,利用loadedmetadata 事件获取视频媒体的维度,请参阅***.com/a/4129579 【参考方案1】:

使用基本 FileReader + Data URL 的有点不干净的解决方案。

<html>
  <head>
<style>
div 
    margin: 20px;

</style>
  </head>
  <body>
    <h1>Get Dimensions</h1>
    <div>
        <label for="load-file">Load a file:</label>
          <input type="file" id="load-file">
    </div>
    <div>
        <button type="button" id="done-button">Get me dimensions</button>
    </div>

    <script src="//cdn.jsdelivr.net/jquery/2.1.4/jquery.js"></script>
    <script>
(function ($) 
  $('#done-button').on('click', function () 
    var file = $('#load-file')[0].files[0];
    var reader  = new FileReader();
    var fileType =  file.type;
    console.log("type", fileType);
    reader.addEventListener("load", function () 
      var dataUrl =  reader.result;
      var videoId = "videoMain";
      var $videoEl = $('<video id="' + videoId + '"></video>');
      $("body").append($videoEl);
      $videoEl.attr('src', dataUrl);

      var videoTagRef = $videoEl[0];
      videoTagRef.addEventListener('loadedmetadata', function(e)
        console.log(videoTagRef.videoWidth, videoTagRef.videoHeight);
      );

    , false);

    if (file) 
      reader.readAsDataURL(file);
    
  );

)(jQuery);
    </script>
  </body>
</html>

【讨论】:

不错的解决方案。我建议使用 object URL 而不是 data URL。它更容易编写,运行更高效。您可以通过以下方式获取它:URL.createObjectURL (file);,然后将其用作src 属性以创建&lt;video&gt; 标签。【参考方案2】:

这是一种在上传前获取视频大小的简单快速的解决方案。 它不需要任何依赖。

const url = URL.createObjectURL(file);
const $video = document.createElement("video");
$video.src = url;
$video.addEventListener("loadedmetadata", function () 
 console.log("width:", this.videoWidth);
 console.log("height:", this.videoHeight);
);

【讨论】:

以上是关于客户端Javascript在上传前获取视频宽度/高度的主要内容,如果未能解决你的问题,请参考以下文章

上传前获取文件大小、图片宽度和高度

上传前获取上传文件大小

使用 JavaScript 获取 HTML5 视频的宽度和高度?

上传前如何获取视频的元数据(长度)?

JavaScript获取页面宽度高度大全

javascript如何获取页面的高度和宽度