H5外包团队:使用HTML5播放短视频代码分享
滑动代码
/**
* 滑动处理
*/
function Touch() {
this.init();
}
Touch.fn = Touch.prototype;
Touch.fn.init = function (params) {
var self = this;
dataStore.lastY = dataStore.translateY;//记录当前位移
self.startY = 0;
self.moveY = 0;
// self.lock = 0;//如果在回调或上升阶段不允许滑动.
self.bodyHeight = window.innerHeight;
self.resetLimitY();
self.isIOS = /ip(?:hone|ad|od)/.test(navigator.userAgent.toLowerCase());
['touchstart','touchmove','touchend'].forEach(function (str) {
document.addEventListener(str,self[str].bind(self));
});
}
Touch.fn.touchstart = function(e){
var self = this;
if(dataStore.lock) return;
self.startY = e.touches[0].pageY;
self.start = Date.now();//标识滑动起始时间,也用于标识滑动start
}
Touch.fn.move = function (y) {
dataStore.translateY = y;
}
Touch.fn.touchmove = function(e){
var self = this;
if(dataStore.lock||!self.start) return;//锁定了,或者没有start,主要是手势一直滑动情况,已经加速度划走了,手势需要松开再重新开始
self.moveY = e.touches[0].pageY - self.startY;
self.move(self.moveY+ dataStore.lastY);
self.detect();
}
Touch.fn.detect = function(isEnd){
var self = this;
// console.log(self.moveY+" "+(Date.now()-self.start));
var a = Math.abs(self.moveY)/(Date.now()-self.start)>=0.5;
if(isEnd){
if(a){
self.limitY = 0;
}
self.movend();
return;
}
if(self.isIOS&&a){//IOS,可以在touchmove时直接滑动,体验流畅。
self.limitY = 0;
self.movend();
} }
Touch.fn.resetLimitY = function () {
this.limitY = this.bodyHeight/3;//位移多少才下滑
}
Touch.fn.touchend = function (e) {
var self = this;
if(dataStore.lock||self.moveY==0||!self.start) return;
self.detect(1);
}
Touch.fn.movend = function () {
// if(dataStore.lock) return;
// dataStore.lock = 1;
var self = this;
/***
* 最后上下位移小于最小值则还原为上一次位移,
* 否则,那么就需要上移或下移一个body宽度,上移则translate加,下移在减去一个body
* 这里是计算出了应该位移高度。
*/
var transformY = Math.abs(self.moveY)<self.limitY?dataStore.lastY:dataStore.lastY+self.bodyHeight*(self.moveY>0?1:-1); /***
* 还需计算最大下滑高度和最大上滑高度
*/
var listUL = document.querySelector(".quan_vcd_list");
var listHeight = listUL.getBoundingClientRect().height; //如果是最后一个li,则不能下滑,
var maxBottom = (listHeight - self.bodyHeight)*-1;
var lastComputeY = transformY>0?0:transformY<maxBottom?maxBottom:transformY;
//停止滑动之后,自动滚动距离,transition
listUL.classList.add('trans'); if(lastComputeY<=0){
var d = lastComputeY-dataStore.lastY;
d&&events.trigger("touch_move",d,(-lastComputeY/self.bodyHeight));
}
self.start = 0;
var raf = window.requestAnimationFrame|| window.webkitRequestAnimationFrame;
raf(function () {
self.move(lastComputeY);
self.moveY = 0;
dataStore.lastY = lastComputeY;//记录确定的位置
if(listHeight+dataStore.lastY<=self.bodyHeight){
events.trigger("turnPage");
}
setTimeout(function () {
listUL.classList.remove("trans");
dataStore.lock = 0;
self.resetLimitY();
},500);
});
}
exports.init = function (opt) {
var config = {
props:['feedData','index'],
data:function () {
return {
play_btn:0,
bg_name:"",
anim_like:[],
vloading:0
}
},
mounted:function(){
addEvent(this);
this.stall = 0;
this.loaderror = 0;
},
methods:{
playBtn:function(){
this.play();
},
onerror:function(){
errors(this,"error:");
},
onbort:function(){
errors(this,"bort:");
},
onstalled:function () {
var self = this;
if(!self.feedData.start) return;
self.vloading = 1;
self.play();
self.stall++;
if(self.stall==2){
util.showTip("网络有点慢哦~");
store.report(27,1);
}
},
onplaying:function(){
var self = this;
compute(self);
self.play_btn = 0;
self.wa("138146.34.1");
store.report(27,0);
},
onpause:function(){
setPlay(this,1);
},
waiting:function () {
var self = this;
clearInterval(self.timer);
self.loadTimes = 0;
self.timer = setInterval(function () {
self.loadTimes++;
if (self.loadTimes >= 2) {//连续3次未播放,当作是卡住了
self.aPause();
self.vloading = 1;
}
}, 1800);
},
ondurationchange:function(){
compute(this);
},
onloadedmetadata:function(){
compute(this);
},
ontimeupdate:function(){
timeupdate(this);
},
aPause:function(){
var self = this;
self.audio&&self.audio.pause();
},
aPlay:function(){
var self = this;
self.audio&&self.audio.play();
},
pause:function(){
var self= this;
self.video.pause();
self.aPause();
self.vloading = 0;
clearInterval(self.timer);
},
play:function(isMove){
videoPlay(this,isMove);
},
checkLoading:function(){
checkLoading(this);
},
show_ani:function (e) {
showAni(this,e);
},
click_pause:function (e) {
clickPause(this,e);
},
onx5videoexitfullscreen:function (params) {
this.video.play();
},
hideAll:function () {
console.log("hideAll");
} }
};
Vue.component('video-com',util.assign(config,opt));
}
/**
* 视频暂停
* @param {*} self
*/
function clickPause(self,e) {
var feed = self.feedData;
if(feed.goods_show){
feed.goods_show = 0;
feed.hideOpt = 0;
return;
}
if(feed.input_show==0&&feed.comments_show){
feed.hideOpt = 0;
feed.comments_show = 0;
return;
}
if(feed.input_show){//评论的时候,不允许操作。
return;
}
if(self.dt>0){
self.show_ani(e);
return;
}
self.dt = setTimeout(function () {
self.dt = 0;
},400); if(self.t||Date.now-self.dbclick<){//dbclick之后,1.5秒不响应点击播放暂停
return;
}
self.t = setTimeout(function () {
self.t = 0;
if(self.play_btn){
self.play();
}else{
self.pause();
}
},600);
}
/**
* 双击视频动画
* @param {*} self
*/
function showAni(self,e) {
clearTimeout(self.t);
self.t = 0;
clearTimeout(self.dt);
self.dt = 0;
self.dbclick = Date.now();
var feed = self.feedData;
if(!(feed.commentid>0)&&!self.praising){
self.praising = 1;
store.add_praise(feed,function () {
self.praising = 0;
},detailUtil.getOnePic(feed));
}
var like = self.anim_like;
var len = like.length;
if(len>=8){
like.splice(0,len-5);
}
like.push({x:e.pageX-100,y:height*this.index+e.pageY - 100});
}
/**
* 检测下载是否完成
* @param {*} self
*/
function checkLoading(self) {
var interval = window.setInterval(getLoaded,100);
// 获取视频已经下载的时长
function getLoaded() {
var end = 0;
try {
end = parseInt(self.video.buffered.end(0) || 0)+2;
} catch(e) {
}
if(end>=self.duration){
clearInterval(interval);
self.loadedAll = 1;
var nextItem = store.store.feedList[self.index+1];
if(nextItem){//存在下一条
//没有播放视频,既还没有加载完成。
if(!nextItem.playurl) nextItem.playurl = nextItem.videourl;
//有背景音乐,但是播放的背景音乐未加载完成,则开始加载
if(!nextItem.bgmurl_p&&nextItem.bgmurl){
nextItem.bgmurl_p = nextItem.bgmurl;
}
} }
return end
}
}
/**
* 播放视频
* @param {*} self
*/
function videoPlay(self,isMove) {
self.play_btn = 0; self.aPlay(); isMove&&(self.video.currentTime = 0);
if(self.audio){
self.video.volume = 0;
self.video.muted =1;
}
var feed = self.feedData;
if(!feed.playurl){
feed.playurl = feed.videourl;
self.video.load();
}
self.video.play();
isMove&&setTimeout(function (paras) { if(isIOS&&!feed.start&&window.isXCX==1){
self.play_btn = 1;
clearInterval(self.timer);
}else if(!feed.start){
setTimeout(function () {
if(feed.start) return;
setPlay(self,1);
clearInterval(self.timer);
},2000);
}
},1000);
self.waiting();
}
/**
* 播放中处理
* @param {*} self
*/
function timeupdate(self) {
var ct = self.video.currentTime;
if(!self.duration) return;
self.feedData.play_time = ct*100/self.duration;//设置到住storage
// console.log("timeupdate");
self.loadTimes>=2&&self.aPlay();
var feed = self.feedData;
if(!feed.start&&ct>0){
feed.hide = 0;//video is hide or show
feed.start = 1;//video is start ,should hide poster
}
self.vloading = 0;
self.play_btn = 0;
self.loadTimes = 0;
self.loaderror = 0;
if(!self.move&&ct+1>=self.duration/2){
self.feedData.goodsMove = 1;
self.move = 1;
}
if(Math.round(ct)%3==0){
self.wa("138146.35.1");
}
if(!self.waDone&&Math.ceil(ct+1)>=self.duration){
self.wa("138146.9.1");
self.waDone = 1;
}
}
/**
* 处理视频和背景音乐
* @param {*} self
*/
function addEvent(self) {
self.$nextTick(function () {
self.video = self.$el.querySelector("video");
var arry = ['stalled','playing', 'timeupdate', 'abort', 'error','durationchange','loadedmetadata','pause','x5videoexitfullscreen'];
arry.forEach(function (str) {
self.video.addEventListener(str,self['on'+str]);
});
if(self.index==0){
loadWX(function (env) {
if(env&&isAndroid) return;
self.play();
});
}
});
var feed = self.feedData;
handleBGM(feed,self); events.listen("touch_move",function (direct,i) {
handleMove(self,feed,direct,i);
});
}
/**
* 处理滑动播放
* @param {*} self
* @param {*} feed
* @param {*} direct
* @param {*} i
*/
function handleMove(self,feed,direct,i) {
if(i==self.index){
detailUtil.setShare(self.feedData);
if(!feed.playurl){
feed.playurl = feed.videourl;
if(!feed.bgmurl_p&&feed.bgmurl){
feed.bgmurl_p = feed.bgmurl;
self.audio.load();
}
self.video.load();
}
self.$nextTick(function () {
store.addPlayNum(feed.shareid);
if(self.audio&&!self.audioLoaded){
var int = setInterval(function () {
if(self.audioLoaded){
clearInterval(int);
self.play(1);
}
},100);
}else{
self.play(1);
}
});
}
//direct>0 则是下滑,页面出现上一个视频,则当前位置的下一个视频要暂停,
//direct<则是上滑,页面要播放下一个视频了,则当前位置的上一个视频要暂停
if(self.index == i+(direct>0?1:-1)){
self.pause();
if(!self.loadedAll){
feed.playurl = "";//如果是未加载完成,那么就不要加载了。
feed.start = 0;
feed.hide = 1;
}
if(!self.audioLoaded){
feed.bgmurl_p = "";
}
}
if(self.index>=i+7||self.index<=i-7){
feed.maxHide = 1;//最大超过16个节点,则隐藏。
feed.playurl = "";//最大超过16个节点,则把其他视频干掉。
feed.start = 0;
feed.hide = 1;
}else{
feed.maxHide = 0;
}
}
function loadWX(cb) {
if(device.scene=="weixin"){
if(window.WeixinJSBridge){
cb(1);
}else{
document.addEventListener("WeixinJSBridgeReady", function() {
cb(1);
});
}
}else{
cb();
}
}
/**
* 处理背景
* @param {*} feed
* @param {*} self
*/
function handleBGM(feed,self) {
//背景音乐
var bgm=feed.bgm;
if(bgm&&window.bgmlist&&bgmlist[bgm]){
self.bg_name = bgmlist[bgm].bgmname;
feed.bgmurl = bgm+".mp3";
if(self.index==0){
feed.bgmurl_p = feed.bgmurl;
}
self.audio = self.$el.querySelector("audio");
setPlay(self,0);
var t = setTimeout(function () {//超时处理
done();
},4000);
loadWX(throuth);
function throuth(){
self.audio.addEventListener("canplaythrough",function () {
done();
});
}
function done(){
clearTimeout(t);
self.vloading = 0;
self.audioLoaded = 1;
!feed.start&&(setPlay(self,1));//还没播放,则吧播放按钮弹出来
} }else{
setPlay(self,1);
}
}
function compute(self) {
if(self.isCd) return;
var d = self.video.duration;
if (d>0) {
self.isCd = true;
self.duration = d;
self.checkLoading();
}
}
function setPlay(self,f){
self.play_btn = f;
self.vloading = !f;
}
function errors(self,msg) {
if(!self.video||!self.feedData.start) return;
self.loaderror++;
if(self.loaderror<=2){
self.play();
return;
}
setPlay(self,1);
msg += JSON.stringify(self.video.error)+","+self.video.src;
store.report(26,0,msg);
}
有H5项目需求欢迎联系我们 我们提供免费的项目评估报价
QQ:372900288
WX:Liuxiang0884
H5外包团队:使用HTML5播放短视频代码分享的更多相关文章
- html5播放mp4视频代码
1.nginx支持flv和mp4格式播放 默认yum安装nginx centos7安装nginx时候应该是默认安装nginx_mod_h264_streaming模块的 # nginx -V查看是否安 ...
- H5外包团队 H5开发微信APP的优势有哪些
H5外包团队 H5开发微信APP的优势有哪些
- H5外包团队 2019案例更新
H5外包团队 2019案例更新 本项目控件均为动态加载,3D部分使用Unity3D,其它基于ReactJS,NodeJS,部分使用cocos2D,由于项目涉密,只能发部分截图,欢迎联系索取更多案例,企 ...
- 4G来临,短视频社交分享应用或井喷
因为工作的原因,接触短视频社交应用的时间相对较多,不管是自家的微视,还是别人家的Vine.玩拍.秒拍等,都有体验过.随着时间的推移,我愈发感受到有一股似曾相识的势能正在某个地方慢慢积聚,直到今天我才猛 ...
- 用HTML5播放IPCamera视频
HTML5增加了vedio标签,能直接播放视频,但是播放的格式是有限的. 这里将IPCamera的视频转换OGG格式,再通过HTML5网页播放,播放还是很清晰的.IPCamera要支持RTSP等视频流 ...
- H5外包团队 技术分享 基于H5+的项目分享
项目截图: 有H5项目需求欢迎联系我们 我们提供免费的项目评估报价 QQ:372900288 WX:Liuxiang0884
- H5外包团队 MUI文档技术资料大全
HTML5+ API缓存:http://www.dcloud.io/docs/api/zh_cn/cache.html h.js:http://www.hcoder.net/h vue.js:http ...
- HTML5外包团队:HTML5 Canvas使用教程
canvas 元素用于在网页上绘制图形. 什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canv ...
- H5外包团队 android视频压缩,使用ffmpeg方案
android视频压缩,使用ffmpeg方案,集成fdk-aac与264编码,适用于32位系统与64位系统,支持ARM 32/64 cpu与x86 32/64 cpu,mips 32/64 cpu,即 ...
随机推荐
- Oracle debug
执行慢的使用使用debug环境变量,可以收集详细的日志 rootcrs.pl/roothas.pl执行慢 参考如下文档设置debug环境变量,重现问题并收集详细日志. How to turn on r ...
- PHP----------php的opcache扩展配置参数介绍
[opcache]zend_extension = "路径/ext/php_opcache.dll" ; Zend Optimizer + 的开关, 关闭时代码不再优化.opcac ...
- http协议状态码及其意义
什么是状态码? 状态码的作用是:服务器告诉客户端,发生了什么事. 在http协议中状态码出现在http response 的第一行.它会返回一个三位数的状态码和状态信息.状态码为了便于程序进行处理,而 ...
- UGUI-Text——自适应
Text组件上勾选Best Fit,当内容变多时,按原来大小装不下时,会总体缩放显示
- react16实战总结
实战总结 react实战基础 遇到的一些坑 li里要带key值否则会警告,这个问题在vue中也存在, 考虑到虚拟DOM中diff,所以不要用index作为key值,而要用item. 2.immutab ...
- linux 命令 jps 和 goassess
jps (Java Virtual Machine Process Status Tool) 是java提供的一个显示当前所有java进程pid的命令,适合在linux/unix平台上简单察看当前j ...
- 整理的Python零基础入门!转载他人的!
安装Python 前往 官网下载 对应平台对应工具.另外Python2.7版本和3.3版本并不兼容,所以开发时请注意使用Python的版本. 作为Mac OS X使用者,其实更推荐 PyCharm I ...
- MVC(I)
实际开发我们是这样的:
- 语音活性检测器py-webrtcvad安装使用
谷歌为WebRTC项目开发的VAD是目前最优秀.最先进和免费的产品之一.webrtcvad是WebRTC语音活动检测器(VAD)的python接口.兼容python2和python3.功能是将一段音频 ...
- php 防跨站表单提交
一种最优方式防跨站表单提交,用户限时token 就是生成一个随机且变换频繁加密字符串(可逆和不可逆).放在表单中,等到表单提交后检查. 这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会 ...