ZZJ
2022-03-09 cc7401e771e13b40bb7dea11ec26da3acfc8e5c7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/* eslint-disable */
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;
};