You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
266 lines
11 KiB
JavaScript
266 lines
11 KiB
JavaScript
var Html5VideoPlayer = function (config) {
|
|
this.vWidth = config.vWidth || 200;
|
|
this.vHeight = config.vHeight || 100;
|
|
this.vId = config.vId || '';
|
|
this.vSrc = config.vSrc || '';
|
|
this.vZIndex = config.vZIndex || 100;
|
|
this.vPoster = config.vPoster || "";
|
|
this.vShowLightSwitch = config.vShowLightSwitch != undefined ? config.vShowLightSwitch : true;
|
|
this.vHaveLight =
|
|
{
|
|
onText: "开灯",
|
|
onIcon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjEwcrIlkgAAAnlJREFUOE9tk01oWkEQx1ftoemlXyAEcioNtBGhPQZKEHrPJSiigpDY0gTUKhT1JFERcggGT1WQ6KHaSyu1KthopfEjJlVbjKgFBTWCX4nEg+hBfZ19VSu8LPzYeTM7/5l9u0sjCALh4XK5yJlOpyMajfYEzKfj8fgugEajUXc4HOb7/X5hMBiQ65RKJTkjLIBxOp0YGgit+Xw+Rblcdl9eXkYrlUook8l8BP9bs9m8tr+/TwNmeTPDbrcjh8Ox4vF4lL1e70+n08k2m82f2Wz2WyQS8V9cXJzZbDaFTqdb0Wq1VAGr1YosFgsXKnuvr6/z7XY71Wq1kvl8PnR0dPT59PQ0kMvl3Gq1mqtSqagCBwcHyGQySbrdbhYSyeRarRZPpVL+QCDwKRaLecB3JpPJXkmlUqqAwWBAer1+a1L1O66Mk4PBoBt3kEwm/dBVXCKRbMGgCmg0GgTtrR8fHzvS6fQPnIQr4zmRSHwtlUpRiH0QiUTrQqGQKqBQKJBcLl8CkZ1qtXoSj8d90Wj0C1T2FQqFEPzQs+3t7R0ej7cE3CwA+0Obm5urRqNRAwkZ2EawWCyGrq6usru7uxoul7uKk28UEAgEaAKdz+dvhMNhJxzdCXQTwzYkbwB0AGGm92dmTAOTeXlvb+9do9H4Xa/Xf2Eb/MvzaygCLBaLVJ6wIBaL38CJnOOtYBv8C9M4k8mkdvDvYiPE4XBIETab/drr9RJwNwgGg/EeF8BMB6WDWWQiggXgBxJut5sUmI/Pv6H/rcBDhMBt4D6wiAXg/InDw8OpwCL4HwB38KO9qQMGBO4Bj4Bn8KRfAAHgHL5fAs+Bx8BD4NZU4C9hkBlGyPjr5wAAAABJRU5ErkJggg==",
|
|
offText: "关灯",
|
|
offIcon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAm5JREFUeNp0U81vElEQf+/tB9sFSiFCKSTWiolA7cdBYzTRYLQ3z8ZrD5oYD3r10Hjy4B/QkyZ60IMfJxOT2sZmQ4ipacTSSAmliBzED6CUApWF/XAesC00dJLJzM7M7/dmdt7Duq4jKq8eYmQIxsgPJgApO82C3QWNKypKqGq7ZvZxG8eiXqEsl23u4Nnx0J2QzTPqrddzeuln5lcy8jaynUt7IL9MOQ0AMRxVQ0jTUdA2cub8ldlndx3HA+MIq2JdzvGqkPVfuPng9qD79EXoYqqpHJy4T6ABAbQ3NXnt3lVVqxFNazRpgwwjIEUpK6WdFTw9cysEBOcU7YBgfwSlPduxIY/PpygVGbh1AGqy/AfImxgIVYd3bLShoGFdP5qAbcgFpba3qWJMWuBqdYslxEQ4bggjnWlCX6QvQWeufDYeSQ56yXS1mvxHT2YYnphMHmw2n+R+bKwlgeB3918n3R0AyaeV9y+/mgcm6jzv5AXBzYiij5jNpxgTd6K+/GY+Bj9b6nTbS4Da+07vFIufl17ML7iHrwtWa5CI4hgBa3r35NHibikfgZrNvh2UqwhV9lpdLKbj0fT3b/F1nndxLGthtmJf1jOJVQpcOHRveu9BR1U4JZxY/bgBYI5hLDz1oSRMy44kkGI98VQ2GZUxZjAhLKY+jRnJ5x/6bEFaa+uNGRdyOp21cJRkJiMDrlQqheaeyvZLE6hm1HXL4beAXi/9RaFQELwiCgT8qNHgUT9gvy1QXwC1S5I0QgOFQgGVy3kjT2MOULEbh43njGFgMNZO0SB8W8DOgXqg5j7YbdAKaIkuDWKtq/dfgAEARTYbucps2QYAAAAASUVORK5CYII=",
|
|
};
|
|
};
|
|
Html5VideoPlayer.prototype.CallBack = function (vCallBack) {
|
|
this.vCallBack = vCallBack;
|
|
};
|
|
//全屏
|
|
var FullScreen = function (video) {
|
|
var fullscreen = false;
|
|
video.addEventListener('dblclick', function () {
|
|
if (!fullscreen) {
|
|
if (video.requestFullscreen) {
|
|
video.requestFullscreen();
|
|
}
|
|
//FireFox
|
|
else if (video.mozRequestFullScreen) {
|
|
video.mozRequestFullScreen();
|
|
}
|
|
//Chrome等
|
|
else if (video.webkitRequestFullScreen) {
|
|
video.webkitRequestFullScreen();
|
|
}
|
|
//IE11
|
|
else if (video.msRequestFullscreen) {
|
|
video.msRequestFullscreen();
|
|
}
|
|
}
|
|
else {
|
|
if (document.exitFullscreen) {
|
|
document.exitFullscreen();
|
|
}
|
|
else if (document.mozCancelFullScreen) {
|
|
document.mozCancelFullScreen();
|
|
}
|
|
else if (document.webkitCancelFullScreen) {
|
|
document.webkitCancelFullScreen();
|
|
}
|
|
else if (document.msExitFullscreen) {
|
|
document.msExitFullscreen();
|
|
}
|
|
}
|
|
fullscreen = !fullscreen;
|
|
}, false);
|
|
};
|
|
//开关灯
|
|
var LightSwitch = function (that, videoDiv) {
|
|
//关灯效果样式
|
|
var shadowId = "shadow_" + new Date().getTime();
|
|
var shadowCss = ""
|
|
+ "#" + shadowId + "{"
|
|
+ " position:absolute;"
|
|
+ " background-color:gray;"
|
|
+ " left:0;"
|
|
+ " top:0;"
|
|
+ " width:100%;"
|
|
+ " height:100%;"
|
|
+ " z-index:" + that.vZIndex + ";"
|
|
+ "}";
|
|
var style = document.createElement('style');
|
|
style.innerHTML = shadowCss;
|
|
document.head.appendChild(style);
|
|
|
|
//关灯效果
|
|
var shadow = document.createElement('div');
|
|
shadow.id = shadowId;
|
|
shadow.style.display = "none";
|
|
videoDiv.appendChild(shadow);
|
|
|
|
//开/关灯按钮
|
|
var closeLight = '<img src="' + that.vHaveLight.offIcon + '"/>' + that.vHaveLight.offText;
|
|
var openLight = '<img src="' + that.vHaveLight.onIcon + '"/>' + that.vHaveLight.onText;
|
|
var light = document.createElement('span');
|
|
light.id = "light_" + new Date().getTime();
|
|
light.className = "close-light";
|
|
light.style.top = 20;
|
|
light.style.position = "absolute";
|
|
light.style['z-index'] = that.vZIndex + 2;
|
|
light.style.left = that.vWidth;
|
|
light.innerHTML = closeLight;
|
|
//开/关灯按钮点击事件
|
|
light.addEventListener('click', function () {
|
|
if (this.className == "close-light") {
|
|
//关灯
|
|
this.innerHTML = openLight;
|
|
this.className = "open-light";
|
|
shadow.style.display = "block";
|
|
}
|
|
else {
|
|
//开灯
|
|
this.innerHTML = closeLight;
|
|
this.className = "close-light";
|
|
shadow.style.display = "none";
|
|
}
|
|
});
|
|
videoDiv.appendChild(light);
|
|
};
|
|
Html5VideoPlayer.prototype.Create = function (querySelector) {
|
|
this.videoPlayerQuerySelector = document.querySelector(querySelector);
|
|
//div
|
|
var videoDiv = document.createElement('div');
|
|
videoDiv.id = "videop_" + this.id;
|
|
this.videoPlayerQuerySelector.appendChild(videoDiv);
|
|
|
|
//视频控件
|
|
var video = document.createElement('video');
|
|
video.id = "video_" + this.vId;
|
|
video.data = this.vId;
|
|
video.innerHTML = "您的浏览器不支持html5 video!";
|
|
//video.autoplay = 1;
|
|
video.loop = 1;
|
|
video.controls = 1;
|
|
video.preload = "none";
|
|
//video.style.position = "absolute";
|
|
video.style['z-index'] = this.vZIndex + 2;
|
|
video.style['background-color'] = "#999";
|
|
if (this.vPoster != '') {
|
|
video.poster = this.vPoster;
|
|
}
|
|
video.width = this.vWidth;
|
|
video.height = this.vHeight;
|
|
video.src = this.vSrc;
|
|
videoDiv.appendChild(video);
|
|
|
|
//双击全屏
|
|
FullScreen(video);
|
|
//开/关灯
|
|
this.vShowLightSwitch && LightSwitch(this, videoDiv);
|
|
//键盘控制
|
|
document.addEventListener("keydown", function () {
|
|
var currentTime = CallbackReturnObj.GetCurrentTime();
|
|
var currentVolume = CallbackReturnObj.GetVolume();
|
|
switch (event.keyCode) {
|
|
//左键
|
|
case 37:
|
|
returnObj.SetCurrentTime(currentTime - 5);
|
|
break;
|
|
//右键
|
|
case 39:
|
|
returnObj.SetCurrentTime(currentTime + 5);
|
|
break;
|
|
//上键
|
|
case 38:
|
|
returnObj.SetVolume(currentVolume + 0.1);
|
|
break;
|
|
//下键
|
|
case 40:
|
|
returnObj.SetVolume(currentVolume - 0.1);
|
|
break;
|
|
//空格键
|
|
case 32:
|
|
//CallbackReturnObj.GetInfo("paused") ? returnObj.SetPlay() : returnObj.SetPause();
|
|
break;
|
|
}
|
|
}, false);
|
|
if (video.error != null) {
|
|
var errorMsg =
|
|
{
|
|
1: '用户终止',
|
|
2: '网络错误',
|
|
3: '解码错误',
|
|
4: 'URL无效',
|
|
};
|
|
console.log(video.error.code, errorMsg[video.error.code]);
|
|
return;
|
|
}
|
|
|
|
var that = this;
|
|
//回调
|
|
//用户页面操作 --(事件监听)--> Html5VideoPlayer --(事件回调)--> 页面开发者
|
|
var CallbackReturnObj =
|
|
{
|
|
//获取信息
|
|
GetInfo: function (key) {
|
|
key = key || null
|
|
var info =
|
|
{
|
|
paused: video.paused,
|
|
ended: video.ended,
|
|
duration: video.duration,
|
|
muted: video.muted,
|
|
currentTime: video.currentTime,
|
|
volume: video.volume,
|
|
};
|
|
if (key != null && info[key] != undefined) {
|
|
return info[key];
|
|
}
|
|
return info;
|
|
},
|
|
//获取音量
|
|
GetVolume: function () {
|
|
return video.muted ? 0 : video.volume;
|
|
},
|
|
//获取当前播放的时间
|
|
GetCurrentTime: function () {
|
|
return video.currentTime;
|
|
},
|
|
};
|
|
var videoEventCallback = function (e) {
|
|
video.addEventListener(e, function () {
|
|
if (that.vCallBack != undefined && that.vCallBack[e] != undefined) {
|
|
that.vCallBack[e].call(CallbackReturnObj);
|
|
}
|
|
}, false);
|
|
}
|
|
videoEventCallback("loadstart"); //客户端开始请求数据
|
|
videoEventCallback("suspend"); //延迟下载
|
|
videoEventCallback("abort"); //客户端主动终止下载
|
|
videoEventCallback("progress"); //客户端正在请求数据
|
|
videoEventCallback("error"); //请求数据时遇到错误
|
|
videoEventCallback("stalled"); //网速失速
|
|
videoEventCallback("play"); //play()和autoplay开始播放时触发
|
|
videoEventCallback("pause"); //pause()触发
|
|
videoEventCallback("loadedmetadata"); //成功获取资源长度
|
|
videoEventCallback("waiting"); //等待数据,并非错误
|
|
videoEventCallback("playing"); //开始回放
|
|
videoEventCallback("canplay"); //可以播放,但中途可能因为加载而暂停
|
|
videoEventCallback("canplaythrough"); //可以播放,歌曲全部加载完毕
|
|
videoEventCallback("seeking"); //寻找中
|
|
videoEventCallback("seeked"); //寻找完毕
|
|
videoEventCallback("timeupdate"); //播放时间改变
|
|
videoEventCallback("ended"); //播放结束
|
|
videoEventCallback("ratechange"); //播放速率改变
|
|
videoEventCallback("durationchange"); //资源长度改变
|
|
videoEventCallback("volumechange"); //volume属性(音量)被改变或muted属性(静音)被改变
|
|
|
|
//返回对象
|
|
//页面开发者 --(执行Html5VideoPlayer的返回对象)--> Html5VideoPlayer --(设置video对象)--> 用户页面操作
|
|
var returnObj =
|
|
{
|
|
//设置当前播放的时间
|
|
SetCurrentTime: function (time) {
|
|
video.currentTime = time || 0;
|
|
},
|
|
//设置音量
|
|
SetVolume: function (volume) {
|
|
video.volume = volume || 0;
|
|
},
|
|
//设置静音
|
|
SetMuted: function (muted) {
|
|
video.muted = muted || true;
|
|
},
|
|
//设置暂停
|
|
SetPause: function () {
|
|
video.pause();
|
|
},
|
|
//设置播放
|
|
SetPlay: function () {
|
|
video.play();
|
|
},
|
|
};
|
|
return returnObj;
|
|
};
|