移动端视频转序列图片播放
栏目: JavaScript · 发布时间: 6年前
内容简介:项目所用5s的视频,起初使用video标签直接内嵌到页面,看起来很正常。但是在安卓浏览器会弹出小窗播放,不支持视频内嵌。线上案例:将视频转化成序列帧,用JS控制img src的切换,视觉上达到和播放视频一样的效果。这个方法适用于短视频,建议控制在5M以内。最终导出的图片会转化成base64,然后以数组的形式存放在一个JS文件。如果视频太大的话,导出的图片就会多,那么存放base64的JS文件也将会很大,这个要根据具体情况斟酌。
项目所用5s的视频,起初使用video标签直接内嵌到页面,看起来很正常。但是在安卓浏览器会弹出小窗播放,不支持视频内嵌。
线上案例: https://mc.163.com/m/brain/
解决方案
将视频转化成序列帧,用JS控制img src的切换,视觉上达到和播放视频一样的效果。这个方法适用于短视频,建议控制在5M以内。最终导出的图片会转化成base64,然后以数组的形式存放在一个JS文件。如果视频太大的话,导出的图片就会多,那么存放base64的JS文件也将会很大,这个要根据具体情况斟酌。
1、使用 Premiere 将视频转化成序列帧
选择合适的尺寸,宽750会比较大,可选600,640。质量选择50左右。输出格式选择JPEG,帧速率选择12-15。5s的视频,选择12帧速率,导出了60张:
2、使用node将导出的图片转化成base64
将导出的图片转化成base64,然后以数组的形式存放在一个JS文件,最终生成这个JS文件。
目录结构
|--img |--index.js
const fs = require('fs');
const toBase64 = foldername => {
let fileNmaeArr = fs.readdirSync(foldername);
let strBase64 = "";
fileNmaeArr.forEach((item, index, array) => {
let path = foldername + '/' + item;
let str = fs.readFileSync(path, {
encoding: 'base64'
})
if (index < array.length - 1) {
strBase64 += '\"' + str + '\"' + ",";
} else {
strBase64 += '\"' + str + '\"';
let imgs = `var imgList = [${strBase64}]`;
fs.writeFileSync('img.js', imgs);
console.log("导出成功!")
}
})
}
toBase64('img')
执行 node index.js 导出 img.js
3、JS切换img标签的src,播放序列帧
ImgSequence 调用前,页面要先预加载img.js。
<img src="" id="imgVideo">
var requestAnimFrame = (function() {
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60)
}
)
})()
var ImgSequence = function() {
var _class = function(opt) {
this.container = opt.container;
this.imgArr = [];
this.isOver = false;
this.nowpic = opt.nowpic;
this.stopPicIndex = 0;
this.speed = opt.speed || 12;
this.oldpic = -1;
this.isLoop = opt.isLoop === false ? false : true;
}
_class.prototype = {
loop: function() {
if (this.isOver) {
return;
}
var ntime = +new Date;
var diftime = ntime - this.stime;
this.nowpic = Math.floor(diftime * this.speed * 0.001) + this.stopPicIndex;
if (this.nowpic == this.imgArr.length) {
this.stopPicIndex = 0;
if (this.isLoop) {
this.play();
}
return;
}
requestAnimFrame(() => {
if (+new Date - ntime > 100) {
this.stopPicIndex = this.nowpic;
this.play();
} else {
this.loop();
}
});
if (this.nowpic == this.oldpic) {
return;
}
this.container.setAttribute("src", "data:image/jpg;base64," + this.imgArr[this.nowpic]);
this.oldpic = this.nowpic;
},
show: function() {
if (window["imgList"]) {
this.container.style.display = 'block';
this.imgArr = window["imgList"];
this.play();
}
},
play: function() {
this.nowpic = 0;
this.oldpic = -1;
this.stime = +new Date;
this.stime += this.nowpic * 1000 / this.speed;
this.container.setAttribute("src", "data:image/jpg;base64," + this.imgArr[this.nowpic + this.stopPicIndex]);
this.loop();
},
onplay: function() {
this.isOver = false;
this.play()
},
stop: function() {
this.isOver = true;
this.stopPicIndex = this.nowpic;
}
}
return {
init: function(opt) {
return new _class(opt);
}
}
}()
var imgSequence = ImgSequence.init({
'container': document.getElementById('imgVideo'),//必填
'speed': 12, //可选,每秒播放多少帧,默认12 ,小于imgList的长度
'isLoop': true //可选,默认true
})
imgSequence.show() //初始化显示并播放
imgSequence.stop() //暂停
imgSequence.onplay()//继续播放
以上所述就是小编给大家介绍的《移动端视频转序列图片播放》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Python 播放音乐:使用 mido 编写,播放多声轨 MIDI 文件音乐
- Lotus 云盘 2.2 发布,增加视频转码及在线播放、MP3 播放功能
- 播放器性能优化之路
- Java播放多媒体
- iOS 音视频播放
- 使用 AudioTrack 播放音频轨道
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
技术之瞳——阿里巴巴技术笔试心得
阿里巴巴集团校园招聘笔试项目组 / 电子工业出版社 / 2016-11 / 69
《技术之瞳——阿里巴巴技术笔试心得》由阿里巴巴集团校园招聘笔试项目组所著,收集了阿里历年校招中的精华笔试题,涉 及多个领域。《技术之瞳——阿里巴巴技术笔试心得》中内容大量结合了阿里巴巴的实际工作场景,以例题、解析、习题的形式,引 导读者深入理解技术上的关键点、紧要处,夯实基础,启发思考。《技术之瞳——阿里巴巴技术笔试心得》内容不仅专业、有趣,更 是将理论知识与实践应用结合起来,以场景化的问答娓娓道......一起来看看 《技术之瞳——阿里巴巴技术笔试心得》 这本书的介绍吧!