html5 mp4文件查看,MP4Box 借用HTML5 file api 本地读取 mp4 头信息
文章目录
html5 提供了一套可以操作本地文件的 api ,但是有一定的局限性
必须由用户发起一个事件,所以你不要妄想着用户浏览器加载某个站点时,主动去读取他本地硬盘的资料....不可能的.
你的浏览器必须支持 html5 的 file api ,所以你也不要妄想去兼容IE6
用户发起行为比如: file upload 操作, 文件拖拽 等.
最近遇到一个需求
1.本地上传视频要保存到七牛服务器
2.提交切割视频任务 (大文件切割成多份)
3.返回视频截图 (按视频长短截取图片,供管理员审核视频内容)
七牛这边提供的有 js-sdk 和 node.js 2种调用方法
我们的处理过程是, 浏览器发起上传事件 --> 请求自己服务器api 获取 token --> 拿到 token 调用 七牛 js-sdk 上传视频到七牛服务器
七牛根据 token ,解析出任务列表,完成任务后 调用 我们服务器的 api 返回任务数据 (截图,切割,视频压缩转码 url 等)
这里需要注意:
浏览器上传文件到七牛时 所带的 token,里面包含了所有一切一切需要七牛做的任务....
当然,你也可以先上传文件到七牛,然后接口去请求七牛api 执行各种各样的 任务也是可以的.
但是,我们希望浏览器上传时,只请求七牛一次,同时把任务都定制好,告诉七牛,剩下的工作就是,坐等七牛回调 api 传过来 任务数据.
但是我们有一个任务是根据视频时长去截图,返回截图供管理员审核
那么问题来了
如何在浏览器上传视频文件时,就知道视频的播放时长呢????
这就是今天和大家分享的内容
浏览器通过 html5 file api 读取 mp4 头信息,获取视频播放长度.
MP4Box 及支持服务器,也支持浏览器直接调用,今天的内容只包括 浏览器调用 MP4Box.js 本地读取 mp4 头信息.获取时长
首先下载 MP4Box.js 然后页面引用
然后定义一个 file 控件
定义一个 滚动条效果
0%
再来一个信息输入显示的地方
给 file 控件的change 事件绑定函数:
var mp4box;
var progressbar;
var progresslabel;
var fileinput;
var chunkSize = 1024 * 1024; // bytes
function dragenter(e) {
e.stopPropagation();
e.preventDefault();
}
function drop(e) {
var file;
if (!e) {
file = document.getElementById('fileinput').files[0];
}
else {
file = e.dataTransfer.files[0];
}
if (file) {
parseFile(file);
}
}
function initialize() {
mp4box = new MP4Box(false);
}
function parseFile(file) {
var fileSize = file.size;
var offset = 0;
var self = this; // we need a reference to the current object
var readBlock = null;
var startDate = new Date();
initialize();
mp4box.onError = function (e) {
console.log("mp4box failed to parse data.");
};
var onparsedbuffer = function (mp4box, buffer) {
console.log("Appending buffer with offset " + offset);
buffer.fileStart = offset;
mp4box.appendBuffer(buffer);
}
var onBlockRead = function (evt) {
if (evt.target.error == null) {
onparsedbuffer(mp4box, evt.target.result); // callback for handling read chunk
offset += evt.target.result.byteLength;
progressbar.progressbar({value: Math.ceil(100 * offset / fileSize)});
} else {
console.log("Read error: " + evt.target.error);
return;
}
if (offset >= fileSize) {
progressbar.progressbar({value: 100});
console.log("Done reading file (" + fileSize + " bytes) in " + (new Date() - startDate) + " ms");
mp4box.flush();
finalizeUI();
return;
}
readBlock(offset, chunkSize, file);
}
readBlock = function (_offset, length, _file) {
var r = new FileReader();
var blob = _file.slice(_offset, length + _offset);
r.onload = onBlockRead;
r.readAsArrayBuffer(blob);
}
readBlock(offset, chunkSize, file);
}
function finalizeUI() {
var content = '';
if (!mp4box || !mp4box.moovStartSent) {
content += 'mp4 : 否
';
} else {
var info = mp4box.getInfo();
var videoLength = 0;
content += 'mp4 : 是
';
content += '创建时间:' + info.created + '
';
content += '视频时长:' + info.duration + ' 毫秒
';
if (info.tracks && info.tracks.length > 0) {
info.tracks.forEach(function (item) {
if (item.size){
videoLength += parseInt(item.size);
}
if(item.video){
content+='分辨率:'+item.video.height+ 'X'+ item.video.width+'
';
}
});
content += '视频大小:' + videoLength / (1000 * 1000) + ' M
出自:MP4Box 借用HTML5 file api 本地读取 mp4 头信息
';
}
}
$('#content').html('').html(content);
}
window.onload = function () {
progressbar = $('#progressbar');
progresslabel = $('#progress-label');
fileinput = $('#fileinput');
progressbar.progressbar({
value: 0,
change: function () {
progresslabel.text(
progressbar.progressbar("value") + "%");
},
complete: function () {
progresslabel.text("Loading Completed!");
}
});
fileinput.button();
}
运行页面我们看下效果
上传一个mp4 看看
大功告成,本地读取视频头信息成功.
对于mp4 的头信息,不一定放在头部,有时也会出现在尾部.如果你愿意用 file api 自己分析视频文件,找到头信息所在位置,然后解析出来也是可以的.
只是费时费力, MP4Box.js 帮我们做了很多繁杂的工作,调用 getInfo 方法准备获得视频头信息.
html5 mp4文件查看,MP4Box 借用HTML5 file api 本地读取 mp4 头信息相关推荐
- html5 txt文件上传,JavaScript html5利用FileReader实现上传功能
本文实例为大家分享了H5利用FileReader上传文件的具体代码,供大家参考,具体内容如下 1. Html部分 文件上传演练 Browse... 2. JS部分 var result = docum ...
- html5音频文件生成波形图代码,HTML5/D3.js 可视音频波形柱状图
JavaScript 语言: JaveScriptBabelCoffeeScript 确定 (function() { var playBtn = document.getElementById('p ...
- python读取txt文件每一行_Python3基础 file for+list 读取txt文本 并 一行一行的输出(低效率)...
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...
- linux打开.mp4文件,mp4文件扩展名,mp4文件怎么打开?
.mp4 文件类型:MPEG-4 Video File 扩展名为.mp4的文件是一个视频文件. 文件说明:Movie or video clip that uses MPEG-4 compressio ...
- mp4v2再学习 -- H264视频编码成MP4文件
一.H264视频编码成MP4文件 参看:H264视频编码成MP4文件 参看:mp4v2在VS2010下的编译与在项目中的使用 最近做项目需要将H264文件封装为mp4文件,从网上找到了MP4V2库,下 ...
- php curl 下载mp4,使用PHP CURL下载MP4文件(Downloading MP4 files with PHP CURL)
使用PHP CURL下载MP4文件(Downloading MP4 files with PHP CURL) 我正在尝试从我的一台服务器下载视频到另一台服务器. 我使用的是CURL,因为copy()没 ...
- ffmpeg学习五:avformat_open_input函数源码分析(以mp4文件为例)
上一节我们写了一个简单的程序,它可以把一个视频文件解码成多张图片.我们只是简单的使用的ffmepg提供的api来实现这一过程的,但对api具体的实现过程却一无所知,因此,从这篇博客看是,就逐步分析这些 ...
- Mp4文件缓冲问题解决方案
2019独角兽企业重金招聘Python工程师标准>>> Mp4文件缓冲问题终极解决方案: 很多用户反映,播放器加载mp4文件时,不能边缓冲边播放,而要等文件都缓冲完毕 后,才开始播放 ...
- html5 iphone菜单栏,如何制作一个HTML5的iPhone应用程序
在过去的一年里,你不是很容易踩踏,对于所有的使用Objective-C开发iPhone程序的开发者而言,日子都不那么好过,你不是为了学习开发iPhone应用程序曾经硬着头皮去读着那生涩难懂的学习教程, ...
- LiveRTMP之MP4文件进行rtmp点播直播推送(三)
前面已经介绍过LiveRTMP,这里不再多说,可以网上搜索相关内容. 本文讲述下基于libLiveRTMP推送库实现的MP4文件的直播推送.Demo中LiveRTMP_FILE的工程是将MP4文件进行 ...
最新文章
- [YTU]_2566( 虚基类练习:动物)
- 2021-10-15 红黑树 概念和平衡操作理解以及与AVL对比分析 恋上数据结构笔记
- MyBatis学习总结(16)——Mybatis使用的几个建议
- Makefile的call函数
- Entity Framework 的一些性能建议
- 【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导
- Maven parent.relativePath
- LeetCode 1276. 不浪费原料的汉堡制作方案(解方程)
- 第一行代码阅读笔记---基本知识
- smoothstep
- 【Scala】Scala Java Error: value filter is not a member of *
- python数据分析师工资待遇_预测python数据分析师的工资
- 修改密码-测试用例设计
- php 5分钟前,PHP实现时间轴函数(刚刚、5分钟前)
- Android 如何修改factory mode下FM的默认测试频点及阀值
- 关于计算机信息学奥赛视频,震惊!信息学奥赛好处竟然这么多
- emmx文件用什么软件打开电脑_我告诉你emmx文件怎么打开
- 《张萌:高效能人士的自我管理》学习笔记
- pycharm IDE中英文切换
- TCP协议用socket连接时客户端请求服务器read()一直阻塞解决