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