import { PCMPlayer } from './pcm-player' import { WebGLPlayer } from './webgl' export function Player() { this.hPlayer = 0 this.PlayOrPause = 0 this.MediaName = null this.isStream = false this.canvas = null this.timeLabel = null this.timeTrack = null this.CurPos = 0 this.displayDuration = '00:00:00' this.pcmPlayer = null this.webglPlayer = null this.trackTimer = null } Player.prototype.play = function( url, canvas, isStream, timeTrack, timeLabel, payload ) { if (this.hPlayer != 0) return this.MediaName = url this.isStream = isStream this.canvas = canvas //hWnd this.timeTrack = timeTrack this.timeLabel = timeLabel var This = this this.timeTrack.oninput = function() { This.seek(This.timeTrack.value) } this.TurboWorker = new Worker('/libs/wasmPlayer/turbo.js') this.hPlayer = 1 this.PlayOrPause = 1 this.TurboWorker.onmessage = function(evt) { switch (evt.data.command) { case 'initialized': { This.TurboWorker.postMessage({ command: 'play', media_name: url, other: isStream, payload: payload, }) break } case 'create_video': { This.VideoParam = evt.data.param //{duration:xxx,width:xxx,height:xxx} This.webglPlayer = new WebGLPlayer(This.canvas) if (This.timeTrack) { This.timeTrack.min = 0 This.timeTrack.max = This.VideoParam.duration This.timeTrack.value = 0 This.displayDuration = This.formatTime( This.VideoParam.duration / 1000 ) } This.startTrackTimer() break } case 'create_audio': { This.AudioParam = evt.data.param //{channel:Channel,sample_rate:SampleRate} This.pcmPlayer = new PCMPlayer({ encoding: '16bitInt', channels: This.AudioParam.channel, sampleRate: This.AudioParam.sample_rate, flushingTime: 5000, }) break } case 'deliver_video': { //sample:{time_stamp:xxx,data:xxx} This.CurPos = evt.data.sample.time_stamp This.webglPlayer.renderFrame( evt.data.sample.buf, This.VideoParam.width, This.VideoParam.height ) break } case 'deliver_audio': { //sample:{time_stamp:xxx,data:xxx} This.pcmPlayer.play(evt.data.sample.buf) break } default: return } } } Player.prototype.pause = function() { if (this.hPlayer == 0 || this.PlayOrPause == 0) return this.PlayOrPause = 0 this.TurboWorker.postMessage({ command: 'pause' }) } Player.prototype.resume = function() { if (this.hPlayer == 0 || this.PlayOrPause == 1) return this.PlayOrPause = 1 this.TurboWorker.postMessage({ command: 'resume' }) } Player.prototype.stop = function() { if (this.hPlayer == 0) return this.hPlayer = 0 this.TurboWorker.postMessage({ command: 'stop' }) this.stopTrackTimer() if (this.pcmPlayer) { this.pcmPlayer.destroy() this.pcmPlayer = null } //webglPlayer? } Player.prototype.seek = function(ms) { if (this.hPlayer == 0) return this.TurboWorker.postMessage({ command: 'seek', pos: ms }) if (this.pcmPlayer != null) { this.pcmPlayer.destroy() this.pcmPlayer = new PCMPlayer({ encoding: '16bitInt', channels: this.AudioParam.channel, sampleRate: this.AudioParam.sample_rate, flushingTime: 5000, }) } } Player.prototype.fullscreen = function() { if (this.webglPlayer) this.webglPlayer.fullscreen() } Player.prototype.startTrackTimer = function() { var This = this this.trackTimer = setInterval(function() { if (This.timeTrack) This.timeTrack.value = This.CurPos if (This.timeLabel) This.timeLabel.innerHTML = This.formatTime(This.CurPos / 1000) + '/' + This.displayDuration }, 500) } Player.prototype.stopTrackTimer = function() { if (this.trackTimer != null) { clearInterval(this.trackTimer) this.trackTimer = null } } Player.prototype.formatTime = function(s) { var h = Math.floor(s / 3600) < 10 ? '0' + Math.floor(s / 3600) : Math.floor(s / 3600) var m = Math.floor((s / 60) % 60) < 10 ? '0' + Math.floor((s / 60) % 60) : Math.floor((s / 60) % 60) var s = Math.floor(s % 60) < 10 ? '0' + Math.floor(s % 60) : Math.floor(s % 60) return h + ':' + m + ':' + s }