【问题标题】:HTML5 read video metadata of mp4HTML5 读取 mp4 的视频元数据
【发布时间】:2013-09-24 09:00:05
【问题描述】:

使用 HTML5 我试图获取位于 mp4 标题中的属性(即旋转)(我使用视频标签播放它),为此我试图获取构成标题的字节,并知道结构,找到这个原子。

有谁知道如何在 javascript 中做到这一点?

【问题讨论】:

    标签: javascript html video metadata


    【解决方案1】:

    您可以使用mediainfo.js, 它是用emsciptem 编译的javascript 中mediainfo (cpp) 的移植。

    这是一个工作示例:https://mediainfo.js.org/

    您需要包含js/mediainfo.js 文件并将mediainfo.js.mem 文件放在同一文件夹中。

    您需要检查此文件的来源以了解其工作原理: https://mediainfo.js.org/js/mediainfopage.js

    [...]
    
    function parseFile(file) {
        if (processing) {
          return;
        }
        processing = true;
        [...]
    
        var fileSize = file.size, offset = 0, state = 0, seekTo = -1, seek = null;
    
        mi.open_buffer_init(fileSize, offset);
    
        var processChunk = function(e) {
          var l;
          if (e.target.error === null) {
            var chunk = new Uint8Array(e.target.result);
            l = chunk.length;
            state = mi.open_buffer_continue(chunk, l);
    
            var seekTo = -1;
            var seekToLow = mi.open_buffer_continue_goto_get_lower();
            var seekToHigh = mi.open_buffer_continue_goto_get_upper();
    
            if (seekToLow == -1 && seekToHigh == -1) {
              seekTo = -1;
            } else if (seekToLow < 0) {
              seekTo = seekToLow + 4294967296 + (seekToHigh * 4294967296);
            } else {
              seekTo = seekToLow + (seekToHigh * 4294967296);
            }
    
            if(seekTo === -1){
              offset += l;
            }else{
              offset = seekTo;
              mi.open_buffer_init(fileSize, seekTo);
            }
            chunk = null;
          } else {
            var msg = 'An error happened reading your file!';
            console.err(msg, e.target.error);
            processingDone();
            alert(msg);
            return;
          }
          // bit 4 set means finalized
          if (state&0x08) {
            var result = mi.inform();
            mi.close();
            addResult(file.name, result);
            processingDone();
            return;
          }
          seek(l);
        };
    
        function processingDone() {
          processing = false;
          $status.hide();
          $cancel.hide();
          $dropcontrols.fadeIn();
          $fileinput.val('');
        }
    
        seek = function(length) {
          if (processing) {
            var r = new FileReader();
            var blob = file.slice(offset, length + offset);
            r.onload = processChunk;
            r.readAsArrayBuffer(blob);
          }
          else {
            mi.close();
            processingDone();
          }
        };
    
        // start
        seek(CHUNK_SIZE);
      }
    
    [...]
    // init mediainfo
      miLib = MediaInfo(function() {
        console.debug('MediaInfo ready');
        $loader.fadeOut(function() {
          $dropcontrols.fadeIn();
    
          window['miLib'] = miLib; // debug
          mi = new miLib.MediaInfo();
    
          $fileinput.on('change', function(e) {
            var el = $fileinput.get(0);
            if (el.files.length > 0) {
              parseFile(el.files[0]);
            }
          });
        });
    

    这里是带有项目来源的Github地址:https://github.com/buzz/mediainfo.js

    【讨论】:

      【解决方案2】:

      我认为您无法使用 HTML5 及其视频标签从视频中提取如此详细的元数据。此处列出了您可以提取的唯一内容(视频长度、视频轨道等):

      http://www.w3schools.com/tags/ref_av_dom.asp

      当然,在某些浏览器中可能有特殊的附加方法可用,但没有“通用”方法 - 您需要的不仅仅是 HTML5 的现有方法。

      【讨论】:

      • 嗯......我们可以使用图像,但不能使用视频......太糟糕了。 :-/感谢您的回答!我认为有必要,从视频中获取所有字节以执行高级功能
      • @BlackCid 你有没有想过怎么做?又名读出元数据?我也很想获得视频方向等信息。
      • 不,不可能得到最后我决定将原点的方向作为变量发送到服务器并与视频一起存储在数据库中......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2011-05-20
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多