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
|
}
|