前言,为了在apicloud项目中实现视频播放功能,先后做了不少尝试最早简单引入了video.js发现ios效果不佳转战了apicloud内部模块,先后使用了moviePlayer、videoPlayer等模块,安卓兼容性并不乐观部分系统型号存在视频卡死问题。试了不少模块,且顾及需要倍速等需求最后还是回头重拾video.js。(最后附有demo下载地址。)
个人经验:横屏播放不要去纠结全屏问题,设置监听事件,把屏幕改为横屏重新设置播放器宽度高度的做法最佳,自带的全屏兼容不好。
言归正传开始正事:
第一步:video.js包下载(以下代码示例使用的都是个人使用版)
个人使用版:https://pan.baidu.com/s/16kVFb_8aqtSpm7Vf1aWrog 提取码:rpp8 (网上找的版本,有针对APP做一些样式优化)
官方下载版:https://videojs.com/getting-started/
第二步:文件引入
路径只是示范,具体的根据个人项目需求自行更改
CSS:
<link rel="stylesheet" type="text/css" href="../plugins/videojs/css/iconfont.css" />
<link rel="stylesheet" type="text/css" href="../plugins/videojs/css/video-js.css" />
JavaScript:
<script type="text/javascript" src="../plugins/videojs/js/video.min.js"></script>
第三步:初始化
页面初始化直接载入(这部分直接引用demo):
HTML:
<video id="video" webkit-playsinline="true" playsinline="true" class="video-js vjs-default-skin" controls preload="none"
poster="http://video-js.zencoder.com/oceans-clip.png"
data-setup="{}">
<source src="http://视频地址格式1.mp4" type='video/mp4' />
<source src="http://视频地址格式2.webm" type='video/webm' />
<source src="http://视频地址格式3.ogv" type='video/ogg' />
</video>video标签中的poster为设置视频封面、source提供三种不同格式的视频源、可根据项目需求自行更改删除。
JS:
<script type="text/javascript">
var myPlayer = videojs('video');
videojs("video").ready(function(){
var myPlayer = this;
myPlayer.play();
});
</script>后期ajax获取接口数据载入(个人使用方法)(实现断点播放、倍速、自动横屏):
HTML:
<video id="video" webkit-playsinline="true" playsinline="true" class="video-js vjs-default-skin " controls poster="../image/video-backgroud-img2.png"> <!-- <source src="http://vjs.zencdn.net/v/oceans.mp4" type='video/mp4' /> --> <p class="vjs-no-js">播放视频需要启用 JavaScript,推荐使用支持HTML5的浏览器访问。</p> </video>
JS:
myPlayer = videojs("#video", {
"techOrder": ["html5"],
"autoplay": true,
"preload": "auto",
'playbackRates': [0.75, 1, 1.25, 1.5, 1.75, 2],
"inactivityTimeout": 1000 * 5,
"controlBar": {
remainingTimeDisplay: false, //隐藏 TimeDisplay
volumePanel: true, //音量是否显示
captionsButton: false,
chaptersButton: false,
liveDisplay: false,
playbackRateMenuButton: true,
subtitlesButton: false,
fullscreenToggle: false
},
plugins: {
header: {
seek: 0.4,
title: _title,
back: back,
touchmove: function(type) {
switch (type) {
case 'left':
this.player.currentTime(this.player.currentTime() - this.options.seek*4)
break;
case 'right':
this.player.currentTime(this.player.currentTime() + this.options.seek*4)
break;
default:
break;
}
}
}
}
}, function() {
//设置全屏模式
hh=api.winHeight;
ww=api.winWidth;
var rotateBtn = this.controlBar.addChild('button');
var _thisVideo = this;
if(hh>ww){
this.width(hh);
this.height(ww);
}else{
this.width(ww);
this.height(hh);
}
//设置视频路径
this.src(_url);
//恢复观看记录
this.on('loadeddata', function() {
var _whereYouAt = $api.getStorage('video_'+_urlkey);
if(_whereYouAt != 0 && !!_whereYouAt){
api.confirm({
title: '是否恢复上一次的观看记录',
msg: '您之前已经有观看过该视频',
buttons: ['确定', '取消']
}, function(ret, err) {
var _index = ret.buttonIndex;
if(_index == 1){
_thisVideo.currentTime(_whereYouAt);
}else{
$api.setStorage('video_'+_urlkey,0);
}
});
}
})
//处理 部分安卓手机 无法退出全屏问题
this.on('error', function(a) {
api.confirm({
title: '提示',
msg: '视频载入超时,请重新尝试。',
buttons: ['确定', '取消']
}, function(ret, err) {
closeWin();
});
})
//处理 部分安卓手机 无法进入全屏问题
this.on('requestFullscreen', function() {
activeType = 'requestFullscreen'; //更新一下状态
onFullScreen()
})
//处理 部分安卓手机 无法退出全屏问题
this.on('exitFullscreen', function(a) {
activeType = ''; //更新一下状态
onNoramlScreen()
})
//存储视频播放进度
this.on('progress', function(a) {
var howLongIsThis = myPlayer.duration();
var whereYouAt = this.currentTime();
if(whereYouAt >= howLongIsThis){
whereYouAt = 0;
}
$api.setStorage('video_'+_urlkey,whereYouAt);
})
/**
* 监听 视频播放器 进入 退出 全屏事件
* 用以解决全屏 的时候 部分安卓手机 第一次按下keyback键apicloud监听不到问题 需2次apicloud才能监听到(魅族mx4Pro 有此问题)
**/
this.on('fullscreenchange', function() {
activeType = this.isFullscreen() ? 'requestFullscreen' : '';
if (activeType === 'requestFullscreen') {
onFullScreen()
} else {
onNoramlScreen()
}
})
}); // 全屏回调函数
function onFullScreen() {
if ('undefined' !== typeof api) {
api.setFullScreen({
fullScreen: true
});
api.setScreenOrientation({
orientation: 'landscape_left'
});
hh=api.winHeight;
ww=api.winWidth;
if(hh>ww){
myPlayer.width(hh);
myPlayer.height(ww);
}else{
myPlayer.width(ww);
myPlayer.height(hh);
}
}
};
// 退出全屏回调函数
function onNoramlScreen() {
if ('undefined' !== typeof api) {
api.setScreenOrientation({
orientation: 'portrait_up'
});
api.setFullScreen({
fullScreen: false
});
hh=api.winHeight;
ww=api.winWidth;
if(hh>ww){
myPlayer.width(ww);
myPlayer.height(hh);
}else{
myPlayer.width(hh);
myPlayer.height(ww);
}
}
}
function closeWin(){
var jsfun = 'closeWin();';
api.execScript({
script: jsfun
});
}如果不清楚的这边附带一个demo。【基于apicloud的demo】外部调用请自行完善。 wap要用也可以稍作修改。
demo下载:
链接:https://pan.baidu.com/s/1uah8EO2UxzMQiHdTMdOKdw 提取码:iykx
本文为翻滚的胖子原创文章,转载无需和我联系,但请注明来自猿教程iskeys.com
