首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从纯ecmascript的MP4 URL中获取视频的高度和宽度,而不支持h.264?

如何从纯ecmascript的MP4 URL中获取视频的高度和宽度,而不支持h.264?
EN

Stack Overflow用户
提问于 2014-09-14 22:07:04
回答 3查看 7.1K关注 0票数 7

我正在编写一个下载视频的用户脚本。网站的使用JSON文件。

我的脚本的目的是通过根据网页下载和解析视频来获取视频的网址。目前,它可以成功下载视频的URL。

JSON文件的重要部分如下所示:

代码语言:javascript
复制
    {
        "ammProfile": "AMM-HBBTV",
        "version": "VF",
        "versionProg": "1",
        "VFO": "HBBTV",
        "VMT": "mp4",
        "VUR": "http://vo.llnwd.net/v2/am/HBBTV/051332-074-A_SQ_2_VF_01464306_MP4-2200_AMM-HBBTV.mp4"
    }, {
        "ammProfile": "AMM-HBBTV",
        "version": "VF",
        "versionProg": "1",
        "VFO": "HBBTV",
        "VMT": "mp4",
        "VUR": "http://vo.llnwd.net/v2/am/HBBTV/051332-074-A_EQ_2_VF_01464315_MP4-1500_AMM-HBBTV.mp4"
    }

这里的两个URL都是相同的视频,这只是改变的分辨率而已。

那么,如何在不下载整个文件的情况下解析相关的元数据呢?为H.264视频编解码器的标准是非常难读的。

EN

回答 3

Stack Overflow用户

发布于 2014-09-21 03:26:41

你不需要加载整个视频就能得到高度:

代码语言:javascript
复制
function getVideoHeight(url, fnCallback){

var video=document.createElement("video");
  video.autoplay=true;
  video.oncanplay=function(){
     fnCallback(this.offsetWidth, this.offsetHeight);
     this.src="about:blank";
     document.body.removeChild(video);   
  };

  document.body.appendChild(video);
  video.src=url;

}


//test:

getVideoHeight(
  "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4", 
  function(w,h){ alert( w+"X"+h); }
); // shows: "640X360"
票数 8
EN

Stack Overflow用户

发布于 2014-09-15 18:10:39

您可以通过XMLHttpRequest使用Range HTTP报头只获取文件的一部分:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

例如:

代码语言:javascript
复制
xhr.setRequestHeader ('Range', 'bytes=0-' + (fragment_size - 1))
xhr.setRequestHeader ('Content-Length', fragment_size) // This part isn't absolutely required on most (all?) browsers.
票数 3
EN

Stack Overflow用户

发布于 2014-09-21 18:22:31

我使用xhr范围标头下载部分内容,然后使用videoconverter.js获取文件信息,这是ffmpeg的JS版本(您应该检查它的许可是否计划使用这些内容)。

代码语言:javascript
复制
var videoUrl = 'https://dl.dropboxusercontent.com/u/17698405/bla.mp4';

var cmd = '-i myfile.mp4';
var args = parseArguments(cmd);
var sizeToDownload = 200*1024;

retrieveVideo(videoUrl, sizeToDownload, function(fileData) {
	ffmpeg_run({
		arguments: args,
		files: [{
			name: 'myfile.mp4',
			data: fileData
		}],
		print: print,
		printErr: print	
	});	
});

function parseArguments(text) {
  text = text.replace(/\s+/g, ' ');
  var args = [];
  text.split('"').forEach(function(t, i) {
    t = t.trim();
    if ((i % 2) === 1) {
      args.push(t);
    } else {
      args = args.concat(t.split(" "));
    }
  });
  return args;
}


function retrieveVideo(path, fragment_size, callback) {
  var xhr = new XMLHttpRequest();
  xhr.open("GET", path, true);
  xhr.responseType = "arraybuffer";
  xhr.setRequestHeader ('Range', 'bytes=0-' + (fragment_size - 1));

  xhr.onload = function (oEvent) {
    var arrayBuffer = xhr.response;
    if (arrayBuffer) {
      callback(new Uint8Array(arrayBuffer));
    }
  };

  xhr.send(null);
}

var textarea = document.getElementsByTagName('textarea')[0];

function print(text) {
	textarea.value += '> ' + text + '\n';
}
代码语言:javascript
复制
* { box-sizing: border-box }
html,body { height: 100%; margin: 0; padding: 0; overflow: hidden }
textarea { width: 100%; height: 100%; }
代码语言:javascript
复制
<script src="https://rawgit.com/bgrins/videoconverter.js/master/build/ffmpeg-all-codecs.js"></script>
<textarea></textarea>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25838472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档