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 this.loop = false this.preload = true this.preloadFlag = 0 this.statusCallback = (stat) => { console.log(stat) } } 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() This.statusCallback(0) 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 }) This.statusCallback(1) break } case "deliver_video": { if (!This.isStream && This.preload && This.preloadFlag == 0) { This.preloadFlag = 1 This.pause() This.statusCallback(0) } //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 } case "play_failed": { This.statusCallback(-1) This.stop() break } case "play_end": { if (This.loop) { This.seek(0) } 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.exitfullscreen = function() { if (this.webglPlayer) this.webglPlayer.exitfullscreen() } 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 }