zhangzengfei
2022-03-10 170ee55bd1f0858fdbad3147a72c0f185d49a9a6
src/components/wasmPlayer/wasm/player.js
@@ -1,5 +1,5 @@
import { PCMPlayer } from './pcm-player'
import { WebGLPlayer } from './webgl'
import { PCMPlayer } from "./pcm-player"
import { WebGLPlayer } from "./webgl"
export function Player() {
  this.hPlayer = 0
@@ -10,22 +10,21 @@
  this.timeLabel = null
  this.timeTrack = null
  this.CurPos = 0
  this.displayDuration = '00:00:00'
  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
) {
Player.prototype.play = function(url, canvas, isStream, timeTrack, timeLabel, payload) {
  if (this.hPlayer != 0) return
  this.MediaName = url
@@ -42,60 +41,76 @@
    This.seek(This.timeTrack.value)
  }
  this.TurboWorker = new Worker('/libs/wasmPlayer/turbo.js')
  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': {
      case "initialized": {
        This.TurboWorker.postMessage({
          command: 'play',
          command: "play",
          media_name: url,
          other: isStream,
          payload: payload,
          payload: payload
        })
        break
      }
      case 'create_video': {
      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.displayDuration = This.formatTime(This.VideoParam.duration / 1000)
        }
        This.startTrackTimer()
        This.statusCallback(0)
        break
      }
      case 'create_audio': {
      case "create_audio": {
        This.AudioParam = evt.data.param //{channel:Channel,sample_rate:SampleRate}
        This.pcmPlayer = new PCMPlayer({
          encoding: '16bitInt',
          encoding: "16bitInt",
          channels: This.AudioParam.channel,
          sampleRate: This.AudioParam.sample_rate,
          flushingTime: 5000,
          flushingTime: 5000
        })
        This.statusCallback(1)
        break
      }
      case 'deliver_video': {
      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
        )
        This.webglPlayer.renderFrame(evt.data.sample.buf, This.VideoParam.width, This.VideoParam.height)
        break
      }
      case 'deliver_audio': {
      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
    }
@@ -105,19 +120,19 @@
Player.prototype.pause = function() {
  if (this.hPlayer == 0 || this.PlayOrPause == 0) return
  this.PlayOrPause = 0
  this.TurboWorker.postMessage({ command: 'pause' })
  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' })
  this.TurboWorker.postMessage({ command: "resume" })
}
Player.prototype.stop = function() {
  if (this.hPlayer == 0) return
  this.hPlayer = 0
  this.TurboWorker.postMessage({ command: 'stop' })
  this.TurboWorker.postMessage({ command: "stop" })
  this.stopTrackTimer()
  if (this.pcmPlayer) {
    this.pcmPlayer.destroy()
@@ -128,15 +143,15 @@
Player.prototype.seek = function(ms) {
  if (this.hPlayer == 0) return
  this.TurboWorker.postMessage({ command: 'seek', pos: ms })
  this.TurboWorker.postMessage({ command: "seek", pos: ms })
  if (this.pcmPlayer != null) {
    this.pcmPlayer.destroy()
    this.pcmPlayer = new PCMPlayer({
      encoding: '16bitInt',
      encoding: "16bitInt",
      channels: this.AudioParam.channel,
      sampleRate: this.AudioParam.sample_rate,
      flushingTime: 5000,
      flushingTime: 5000
    })
  }
}
@@ -145,14 +160,16 @@
  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
    if (This.timeLabel) This.timeLabel.innerHTML = This.formatTime(This.CurPos / 1000) + "/" + This.displayDuration
  }, 500)
}
@@ -164,16 +181,9 @@
}
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)
  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
  return h + ":" + m + ":" + s
}