文章目录

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 头信息相关推荐

  1. html5 txt文件上传,JavaScript html5利用FileReader实现上传功能

    本文实例为大家分享了H5利用FileReader上传文件的具体代码,供大家参考,具体内容如下 1. Html部分 文件上传演练 Browse... 2. JS部分 var result = docum ...

  2. html5音频文件生成波形图代码,HTML5/D3.js 可视音频波形柱状图

    JavaScript 语言: JaveScriptBabelCoffeeScript 确定 (function() { var playBtn = document.getElementById('p ...

  3. 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 ...

  4. linux打开.mp4文件,mp4文件扩展名,mp4文件怎么打开?

    .mp4 文件类型:MPEG-4 Video File 扩展名为.mp4的文件是一个视频文件. 文件说明:Movie or video clip that uses MPEG-4 compressio ...

  5. mp4v2再学习 -- H264视频编码成MP4文件

    一.H264视频编码成MP4文件 参看:H264视频编码成MP4文件 参看:mp4v2在VS2010下的编译与在项目中的使用 最近做项目需要将H264文件封装为mp4文件,从网上找到了MP4V2库,下 ...

  6. php curl 下载mp4,使用PHP CURL下载MP4文件(Downloading MP4 files with PHP CURL)

    使用PHP CURL下载MP4文件(Downloading MP4 files with PHP CURL) 我正在尝试从我的一台服务器下载视频到另一台服务器. 我使用的是CURL,因为copy()没 ...

  7. ffmpeg学习五:avformat_open_input函数源码分析(以mp4文件为例)

    上一节我们写了一个简单的程序,它可以把一个视频文件解码成多张图片.我们只是简单的使用的ffmepg提供的api来实现这一过程的,但对api具体的实现过程却一无所知,因此,从这篇博客看是,就逐步分析这些 ...

  8. Mp4文件缓冲问题解决方案

    2019独角兽企业重金招聘Python工程师标准>>> Mp4文件缓冲问题终极解决方案: 很多用户反映,播放器加载mp4文件时,不能边缓冲边播放,而要等文件都缓冲完毕 后,才开始播放 ...

  9. html5 iphone菜单栏,如何制作一个HTML5的iPhone应用程序

    在过去的一年里,你不是很容易踩踏,对于所有的使用Objective-C开发iPhone程序的开发者而言,日子都不那么好过,你不是为了学习开发iPhone应用程序曾经硬着头皮去读着那生涩难懂的学习教程, ...

  10. LiveRTMP之MP4文件进行rtmp点播直播推送(三)

    前面已经介绍过LiveRTMP,这里不再多说,可以网上搜索相关内容. 本文讲述下基于libLiveRTMP推送库实现的MP4文件的直播推送.Demo中LiveRTMP_FILE的工程是将MP4文件进行 ...

最新文章

  1. [YTU]_2566( 虚基类练习:动物)
  2. 2021-10-15 红黑树 概念和平衡操作理解以及与AVL对比分析 恋上数据结构笔记
  3. MyBatis学习总结(16)——Mybatis使用的几个建议
  4. Makefile的call函数
  5. Entity Framework 的一些性能建议
  6. 【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导
  7. Maven parent.relativePath
  8. LeetCode 1276. 不浪费原料的汉堡制作方案(解方程)
  9. 第一行代码阅读笔记---基本知识
  10. smoothstep
  11. 【Scala】Scala Java Error: value filter is not a member of *
  12. python数据分析师工资待遇_预测python数据分析师的工资
  13. 修改密码-测试用例设计
  14. php 5分钟前,PHP实现时间轴函数(刚刚、5分钟前)
  15. Android 如何修改factory mode下FM的默认测试频点及阀值
  16. 关于计算机信息学奥赛视频,震惊!信息学奥赛好处竟然这么多
  17. emmx文件用什么软件打开电脑_我告诉你emmx文件怎么打开
  18. 《张萌:高效能人士的自我管理》学习笔记
  19. pycharm IDE中英文切换
  20. TCP协议用socket连接时客户端请求服务器read()一直阻塞解决

热门文章

  1. 简述x264几种码率控制方式的实现
  2. 如何将heic格式转化jpg?
  3. 民营医院网络咨询解答技巧
  4. 如何最高效实现手机~电脑端文件传输?
  5. Macbook鼠标调节外接显示器亮度 - Shades for Mac(屏幕亮度调节软件) V1.2 苹果电脑版
  6. 寻找百度图片搜索接口历程--one
  7. 微分方程Gear方法MATLAB,matlab求解常微分方程(组)
  8. 一款神仙儿 MySQL 审核平台,吊到不行!
  9. 2012年7月份第2周51Aspx源码发布详情
  10. 配置防火墙规则实现 WSL2 访问 Windows 主机服务