Javascript 如何使用纯ecmascript和不支持h.264浏览器的MP4 URL获取视频高度和宽度?

Javascript 如何使用纯ecmascript和不支持h.264浏览器的MP4 URL获取视频高度和宽度?,javascript,ajax,h.264,userscripts,file-structure,Javascript,Ajax,H.264,Userscripts,File Structure,我正在编写一个用于下载视频的用户脚本。网站的flash播放器使用JSON文件。 我的脚本的目的是通过根据网页下载和解析视频来获取视频的url。目前它可以成功下载视频URL的摘录 JSON文件的重要部分如下所示: { "ammProfile": "AMM-HBBTV", "version": "VF", "versionProg": "1", "VFO": "HBBTV", "VMT": "mp4",

我正在编写一个用于下载视频的用户脚本。网站的flash播放器使用JSON文件。
我的脚本的目的是通过根据网页下载和解析视频来获取视频的url。目前它可以成功下载视频URL的摘录

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

    {
        "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视频编解码器的标准很难理解。

您可以通过XMLHttpRequest使用范围HTTP头来获取文件的一部分:

例如:

xhr.setRequestHeader ('Range', 'bytes=0-' + (fragment_size - 1))
xhr.setRequestHeader ('Content-Length', fragment_size) // This part isn't absolutely required on most (all?) browsers.

您无需加载整个视频即可获得高度:

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"

我使用xhr range头下载部分内容,然后使用JS版本的ffmpeg(如果您打算使用这些内容,您应该检查其许可证)获取文件信息

var-videoUrl=”https://dl.dropboxusercontent.com/u/17698405/bla.mp4';
var cmd='-i myfile.mp4';
var args=parseArguments(cmd);
var sizeToDownload=200*1024;
检索视频(视频URL、大小下载、函数(文件数据){
快跑({
参数:args,
档案:[{
名称:“myfile.mp4”,
数据:fileData
}],
打印:打印,
打印错误:打印
});	
});
函数解析参数(文本){
text=text.replace(/\s+/g',);
var args=[];
text.split(“”).forEach(函数(t,i){
t=t.trim();
如果((i%2)==1){
参数推(t);
}否则{
args=args.concat(t.split(“”);
}
});
返回args;
}
函数retrieveVideo(路径、片段大小、回调){
var xhr=new XMLHttpRequest();
xhr.open(“GET”,path,true);
xhr.responseType=“arraybuffer”;
xhr.setRequestHeader('Range','bytes=0-'+(fragment_size-1));
xhr.onload=函数(oEvent){
var arrayBuffer=xhr.response;
if(arrayBuffer){
回调(新的Uint8Array(arrayBuffer));
}
};
xhr.send(空);
}
var textarea=document.getElementsByTagName('textarea')[0];
功能打印(文本){
textarea.value+='>'+text+'\n';
}
*{框大小:边框框}
html,正文{高度:100%;边距:0;填充:0;溢出:隐藏}
text区域{宽度:100%;高度:100%;}


…然后用大部分未经授权的JavaScript解析二进制(MP4)数据片段?如何做到这一点。你能用键入的数组获取字节吗?如果视频是下载的,这将是一个问题".. 从用户的角度来看,但我们可能在这里使用Ajax,它可以明确地以字节的形式读取数据,并将其输入到类型化数组中。即使它完全是客户端的(没有互联网接入),你也可以安装某种假冒的HTTP服务器…@Agamenus:看起来像。浏览器市场的很大一部分不支持H.264视频编解码器。。。HTML5解决方案要求浏览器支持编解码器…@user2284570:实际上,OSX上的firefox会有问题,但大多数mac用户使用Safari或Chrome。如果您有一个flash播放器,您可以使用flash执行相同类型的加载检查卸载。有关浏览器的详细信息,请参阅。好的:根据你的说法,使用互联网的人中有30%的人是微不足道的?我的用户脚本的目的是避免在他们的网站上使用flash。我可以使用pegs H.264支持84%吗?我们可以在几周内再增加8%,因为firefox在下一个流行版本中为所有人添加了H.264。我从来没有说过这是可以忽略不计的,但至少:chrome的使用似乎在增加。但它包括铬作为mp4的支撑物,这并不总是正确的。10%仍然代表着百万用户。类似地,许多网站bowser也为Opera提供了解决方案。我不会提供flash回退,因为我的用户脚本的目的是避免使用它。似乎有一个用于播放flash视频(通常使用H.264)的仅JavaScript的小包装器。但我找不到如何使用它,因为谷歌的模糊器。注意:这看起来是可能的(至少)为音频文件与。对于同源策略没有任何约束,因此AJAX可以工作(这就是我获取文件url的方式)。这里提供的链接不是真正的链接,因为我不能公开共享它们。所有文件使用的视频编码都是H.264,但软件专利不适用于我所在的地区,所以可以解码元数据。好吧,出于好奇,如何规避同源策略?我在那里使用的域允许通过http CORS头进行跨域访问只有在服务器配置为发送正确的CORS头以允许Itanishok时才允许。这就是问题所在:我没有任何特殊访问权限。