import PlayerItem from './PlayerItem.js'
import {Spinner} from './spin.js'
import CONSTANT from './CONSTANT.js'
const PlayerControl = window.PlayerControl;
/* ---------------- PlayerItem ---------------- */
class RealPlayerItem extends PlayerItem {
/**
* @param {*} opt.wrapperDomId 父级id
* @param {*} opt.index 索引
*/
constructor(opt) {
super(opt)
this.canvasId = `${this.domId}-livecanvas`
this.videoId = `${this.domId}-liveVideo`
this.initDom()
this.defaultStatus = $('.default-status', this.$el)
this.error = $('.error', this.$el)
this.controller = $('.player-control', this.$el)
this.initMouseEvent()
/**
* this.state 当前Player状态
* created, ready, playing, pause, stop, closed, error
*/
this.setStatus('created')
}
/**
* 播放器模板
*/
getTemplate() {
let template = `
`
return template
}
/**
* 事件监听
*/
initMouseEvent() {
super.initMouseEvent()
this.hideTimer = null
this.$el.on('mouseenter mousemove', (evt) => {
if (this.status === 'playing') {
this.hideTimer && clearTimeout(this.hideTimer)
this.setDomVisible($('.player-control', $(`#${this.domId}`)), true)
}
})
this.$el.on('mouseleave', (evt) => {
this.hideTimer = setTimeout(() => {
this.setDomVisible($('.player-control', $(`#${this.domId}`)), false)
}, 300)
})
}
/**
* 设置状态,同时控制组件显示
* created, playing, pause, stop, closed, error
*/
setStatus(status, msg) {
this.status = status
switch (this.status) {
case 'created':
case 'closed':
this.setDomVisible(this.defaultStatus, true)
this.setDomVisible(this.error, false)
this.setDomVisible(this.controller, false)
$('.audio-icon', this.$el).removeClass('on').addClass('off')
break;
case 'ready':
case 'playing':
case 'pause':
this.setDomVisible(this.defaultStatus, false)
this.setDomVisible(this.error, false)
break;
case 'error':
this.setDomVisible(this.defaultStatus, false)
$('.error-message', this.$el).text(CONSTANT.errorInfo[msg.errorCode] ? CONSTANT.errorInfo[msg.errorCode] : CONSTANT.errorInfo['defaultErrorMsg'])
this.setDomVisible(this.error, true)
break;
default:
break;
}
}
/**
* 初始化播放器
* @param {*} options.rtspURL
* @param {*} options.decodeMode 可选参数
* @param {*} options.wsURL 可选参数
*/
init(options) {
// testCode
// options.rtspURL = "rtsp://sdfasdf/"
if (this.player) {
this.player.close()
}
if (this.spinner) {
this.spinner.stop()
}
this.spinner = new Spinner({
color: '#ffffff'
}).spin(this.$el[0])
let self = this
this.player = new PlayerControl(Object.assign({
wsURL: this.wsPlayer.wsURL
}, options))
this.setStatus('ready')
this.player.on('ResolutionChanged', function (e) {
console.log(e)
});
this.player.on('PlayStart', function (e) {
console.log(e)
self.setStatus('playing')
});
this.player.on('DecodeStart', function (e) {
console.log('DecodeStart', e)
self.spinner.stop()
if (e.decodeMode === 'video') {
self.videoElem.style.display = '';
self.canvasElem.style.display = 'none';
} else {
self.videoElem.style.display = 'none';
self.canvasElem.style.display = '';
}
$('.stream-info', $(`#${self.domId}`)).text(`${e.encodeMode}, ${e.width}*${e.height}`)
});
this.player.on('UpdateCanvas', function (e) {
if (self.firstTime === 0) {
self.firstTime = e.timestamp;//获取录像文件的第一帧的时间戳
}
});
this.player.on('GetFrameRate', function (e) {
console.log('GetFrameRate: ', e)
});
this.player.on('FrameTypeChange', function (e) {
console.log('FrameTypeChange: ', e)
});
this.player.on('Error', function (e) {
self.spinner.stop()
console.log('Error: ' + JSON.stringify(e))
self.setStatus('error', e)
});
this.player.on('MSEResolutionChanged', function (e) {
console.log('MSEResolutionChanged: ', e)
});
this.player.on('audioChange', function (e) {
console.log('audioChange: ', e)
});
this.player.on('IvsDraw', function (e) {
console.log('IvsDraw: ', e)
});
this.player.on('WorkerReady', function () {
console.log('WorkerReady')
self.player.connect();
})
// this.player.on('FileOver', function (e) {
// console.log('FileOver: ', e)
// });
this.player.on('Waiting', function (e) {
console.log('Waiting: ', e)
});
this.player.on('UpdateTime', function (e) {
console.log('UpdateTime: ', e)
});
this.player.init(this.canvasElem, this.videoElem);
}
}
export default RealPlayerItem