@vtx/player 1.6.2 → 1.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,556 @@
1
+
2
+ export declare class Jessibuca {
3
+
4
+ constructor(params: Config);
5
+
6
+ /**
7
+ * 是否开启控制台调试打印
8
+ @example
9
+ // 开启
10
+ jessibuca.setDebug(true)
11
+ // 关闭
12
+ jessibuca.setDebug(false)
13
+ */
14
+ setDebug(flag: boolean): void;
15
+
16
+ /**
17
+ * 静音
18
+ @example
19
+ jessibuca.mute()
20
+ */
21
+ mute(): void;
22
+
23
+ /**
24
+ * 取消静音
25
+ @example
26
+ jessibuca.cancelMute()
27
+ */
28
+ cancelMute(): void;
29
+
30
+ /**
31
+ * 留给上层用户操作来触发音频恢复的方法。
32
+ *
33
+ * iPhone,chrome等要求自动播放时,音频必须静音,需要由一个真实的用户交互操作来恢复,不能使用代码。
34
+ *
35
+ * https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
36
+ */
37
+ audioResume(): void;
38
+
39
+ /**
40
+ *
41
+ * 设置超时时长, 单位秒
42
+ * 在连接成功之前和播放中途,如果超过设定时长无数据返回,则回调timeout事件
43
+ @example
44
+ jessibuca.setTimeout(10)
45
+ jessibuca.on('timeout',function(){
46
+ //
47
+ });
48
+ */
49
+ setTimeout(): void;
50
+
51
+ /**
52
+ * @param mode
53
+ * 0 视频画面完全填充canvas区域,画面会被拉伸 等同于参数 `isResize` 为false
54
+ *
55
+ * 1 视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边 等同于参数 `isResize` 为true
56
+ *
57
+ * 2 视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全 等同于参数 `isFullResize` 为true
58
+ @example
59
+ jessibuca.setScaleMode(0)
60
+ jessibuca.setScaleMode(1)
61
+ jessibuca.setScaleMode(2)
62
+ */
63
+ setScaleMode(mode: number): void;
64
+
65
+ /**
66
+ * 暂停播放
67
+ *
68
+ * 可以在pause 之后,再调用 `play()`方法就继续播放之前的流。
69
+ @example
70
+ jessibuca.pause().then(()=>{
71
+ console.log('pause success')
72
+ jessibuca.play().then(()=>{
73
+ }).catch((e)=>{
74
+ })
75
+ }).catch((e)=>{
76
+ console.log('pause error',e);
77
+ })
78
+ */
79
+ pause(): Promise<void>;
80
+
81
+ /**
82
+ * 关闭视频,不释放底层资源
83
+ @example
84
+ jessibuca.close();
85
+ */
86
+ close(): void;
87
+
88
+ /**
89
+ * 关闭视频,释放底层资源
90
+ @example
91
+ jessibuca.destroy()
92
+ */
93
+ destroy(): void;
94
+
95
+ /**
96
+ * 清理画布为黑色背景
97
+ @example
98
+ jessibuca.clearView()
99
+ */
100
+ clearView(): void;
101
+
102
+ /**
103
+ * 播放视频
104
+ @example
105
+ jessibuca.play('url').then(()=>{
106
+ console.log('play success')
107
+ }).catch((e)=>{
108
+ console.log('play error',e)
109
+ })
110
+ //
111
+ jessibuca.play()
112
+ */
113
+ play(url?: string): Promise<void>;
114
+
115
+ /**
116
+ * 重新调整视图大小
117
+ */
118
+ resize(): void;
119
+
120
+ /**
121
+ * 设置最大缓冲时长,单位秒,播放器会自动消除延迟。
122
+ *
123
+ * 等同于 `videoBuffer` 参数。
124
+ *
125
+ @example
126
+ // 设置 200ms 缓冲
127
+ jessibuca.setBufferTime(0.2)
128
+ */
129
+ setBufferTime(time: number): void;
130
+
131
+ /**
132
+ * 设置旋转角度,只支持,0(默认) ,180,270 三个值。
133
+ *
134
+ * > 可用于实现监控画面小窗和全屏效果,由于iOS没有全屏API,此方法可以模拟页面内全屏效果而且多端效果一致。 *
135
+ @example
136
+ jessibuca.setRotate(0)
137
+ jessibuca.setRotate(90)
138
+ jessibuca.setRotate(270)
139
+ */
140
+ setRotate(deg: number): void;
141
+
142
+ /**
143
+ *
144
+ * 设置音量大小,取值0 — 1
145
+ *
146
+ * > 区别于 mute 和 cancelMute 方法,虽然设置setVolume(0) 也能达到 mute方法,但是mute 方法是不调用底层播放音频的,能提高性能。而setVolume(0)只是把声音设置为0 ,以达到效果。
147
+ * @param volume 当为0时,完全无声;当为1时,最大音量,默认值
148
+ @example
149
+ jessibuca.setVolume(0.2)
150
+ jessibuca.setVolume(0)
151
+ jessibuca.setVolume(1)
152
+ */
153
+ setVolume(volume: number): void;
154
+
155
+ /**
156
+ * 返回是否加载完毕
157
+ @example
158
+ var result = jessibuca.hasLoaded()
159
+ console.log(result) // true
160
+ */
161
+ hasLoaded(): boolean;
162
+
163
+ /**
164
+ * 开启屏幕常亮,在手机浏览器上, canvas标签渲染视频并不会像video标签那样保持屏幕常亮。
165
+ * H5目前在chrome\edge 84, android chrome 84及以上有原生亮屏API, 需要是https页面
166
+ * 其余平台为模拟实现,此时为兼容实现,并不保证所有浏览器都支持
167
+ @example
168
+ jessibuca.setKeepScreenOn()
169
+ */
170
+ setKeepScreenOn(): boolean;
171
+
172
+ /**
173
+ * 全屏(取消全屏)播放视频
174
+ @example
175
+ jessibuca.setFullscreen(true)
176
+ //
177
+ jessibuca.setFullscreen(false)
178
+ */
179
+ setFullscreen(flag: boolean): void;
180
+
181
+ /**
182
+ *
183
+ * 截图,调用后弹出下载框保存截图
184
+ * @param filename 可选参数, 保存的文件名, 默认 `时间戳`
185
+ * @param format 可选参数, 截图的格式,可选png或jpeg或者webp ,默认 `png`
186
+ * @param quality 可选参数, 当格式是jpeg或者webp时,压缩质量,取值0 ~ 1 ,默认 `0.92`
187
+ * @param type 可选参数, 可选download或者base64或者blob,默认`download`
188
+ @example
189
+ jessibuca.screenshot("test","png",0.5)
190
+ const base64 = jessibuca.screenshot("test","png",0.5,'base64')
191
+ const fileBlob = jessibuca.screenshot("test",'blob')
192
+ */
193
+ screenshot(filename?: string, format?: string, quality?: number, type?: string): void;
194
+
195
+ /**
196
+ * 开始录制。
197
+ * @param fileName 可选,默认时间戳
198
+ * @param fileType 可选,默认webm,支持webm 和mp4 格式
199
+ @example
200
+ jessibuca.startRecord('xxx','webm')
201
+ */
202
+ startRecord(fileName: string, fileType: string): void
203
+
204
+ /**
205
+ * 暂停录制并下载。
206
+ @example
207
+ jessibuca.stopRecordAndSave()
208
+ */
209
+ stopRecordAndSave(): void;
210
+
211
+ /**
212
+ * 返回是否正在播放中状态。
213
+ @example
214
+ var result = jessibuca.isPlaying()
215
+ console.log(result) // true
216
+ */
217
+ isPlaying(): boolean;
218
+
219
+ /**
220
+ * 返回是否静音。
221
+ @example
222
+ var result = jessibuca.isMute()
223
+ console.log(result) // true
224
+ */
225
+ isMute(): boolean;
226
+
227
+ /**
228
+ * 返回是否正在录制。
229
+ @example
230
+ var result = jessibuca.isRecording()
231
+ console.log(result) // true
232
+ */
233
+ isRecording(): boolean;
234
+
235
+
236
+ /**
237
+ * 监听 jessibuca 初始化事件
238
+ * @example
239
+ * jessibuca.on("load",function(){console.log('load')})
240
+ */
241
+ on(event: 'load', callback: () => void): void;
242
+
243
+ /**
244
+ * 视频播放持续时间,单位ms
245
+ * @example
246
+ * jessibuca.on('timeUpdate',function (ts) {console.log('timeUpdate',ts);})
247
+ */
248
+ on(event: 'timeUpdate', callback: () => void): void;
249
+
250
+ /**
251
+ * 当解析出视频信息时回调,2个回调参数
252
+ * @example
253
+ * jessibuca.on("videoInfo",function(data){console.log('width:',data.width,'height:',data.width)})
254
+ */
255
+ on(event: 'videoInfo', callback: (data: {
256
+ /** 视频宽 */
257
+ width: number;
258
+ /** 视频高 */
259
+ height: number;
260
+ }) => void): void;
261
+
262
+ /**
263
+ * 当解析出音频信息时回调,2个回调参数
264
+ * @example
265
+ * jessibuca.on("audioInfo",function(data){console.log('numOfChannels:',data.numOfChannels,'sampleRate',data.sampleRate)})
266
+ */
267
+ on(event: 'audioInfo', callback: (data: {
268
+ /** 声频通道 */
269
+ numOfChannels: number;
270
+ /** 采样率 */
271
+ sampleRate: number;
272
+ }) => void): void;
273
+
274
+ /**
275
+ * 信息,包含错误信息
276
+ * @example
277
+ * jessibuca.on("log",function(data){console.log('data:',data)})
278
+ */
279
+ on(event: 'log', callback: () => void): void;
280
+
281
+ /**
282
+ * 错误信息
283
+ * @example
284
+ * jessibuca.on("error",function(error){
285
+ if(error === Jessibuca.ERROR.fetchError){
286
+ //
287
+ }
288
+ else if(error === Jessibuca.ERROR.webcodecsH265NotSupport){
289
+ //
290
+ }
291
+ console.log('error:',error)
292
+ })
293
+ */
294
+ on(event: 'error', callback: (err: Jessibuca.ERROR) => void): void;
295
+
296
+ /**
297
+ * 当前网速, 单位KB 每秒1次,
298
+ * @example
299
+ * jessibuca.on("kBps",function(data){console.log('kBps:',data)})
300
+ */
301
+ on(event: 'kBps', callback: (value: number) => void): void;
302
+
303
+ /**
304
+ * 渲染开始
305
+ * @example
306
+ * jessibuca.on("start",function(){console.log('start render')})
307
+ */
308
+ on(event: 'start', callback: () => void): void;
309
+
310
+ /**
311
+ * 当设定的超时时间内无数据返回,则回调
312
+ * @example
313
+ * jessibuca.on("timeout",function(error){console.log('timeout:',error)})
314
+ */
315
+ on(event: 'timeout', callback: (error: Jessibuca.TIMEOUT) => void): void;
316
+
317
+ /**
318
+ * 当play()的时候,如果没有数据返回,则回调
319
+ * @example
320
+ * jessibuca.on("loadingTimeout",function(){console.log('timeout')})
321
+ */
322
+ on(event: 'loadingTimeout', callback: () => void): void;
323
+
324
+ /**
325
+ * 当播放过程中,如果超过timeout之后没有数据渲染,则抛出异常。
326
+ * @example
327
+ * jessibuca.on("delayTimeout",function(){console.log('timeout')})
328
+ */
329
+ on(event: 'delayTimeout', callback: () => void): void;
330
+
331
+ /**
332
+ * 当前是否全屏
333
+ * @example
334
+ * jessibuca.on("fullscreen",function(flag){console.log('is fullscreen',flag)})
335
+ */
336
+ on(event: 'fullscreen', callback: () => void): void;
337
+
338
+ /**
339
+ * 触发播放事件
340
+ * @example
341
+ * jessibuca.on("play",function(flag){console.log('play')})
342
+ */
343
+ on(event: 'play', callback: () => void): void;
344
+
345
+ /**
346
+ * 触发暂停事件
347
+ * @example
348
+ * jessibuca.on("pause",function(flag){console.log('pause')})
349
+ */
350
+ on(event: 'pause', callback: () => void): void;
351
+
352
+ /**
353
+ * 触发声音事件,返回boolean值
354
+ * @example
355
+ * jessibuca.on("mute",function(flag){console.log('is mute',flag)})
356
+ */
357
+ on(event: 'mute', callback: () => void): void;
358
+
359
+ /**
360
+ * 流状态统计,流开始播放后回调,每秒1次。
361
+ * @example
362
+ * jessibuca.on("stats",function(s){console.log("stats is",s)})
363
+ */
364
+ on(event: 'stats', callback: (stats: {
365
+ /** 当前缓冲区时长,单位毫秒 */
366
+ buf: number;
367
+ /** 当前视频帧率 */
368
+ fps: number;
369
+ /** 当前音频码率,单位bit */
370
+ abps: number;
371
+ /** 当前视频码率,单位bit */
372
+ vbps: number;
373
+ /** 当前视频帧pts,单位毫秒 */
374
+ ts: number;
375
+ }) => void): void;
376
+
377
+ /**
378
+ * 渲染性能统计,流开始播放后回调,每秒1次。
379
+ * @param performance 0: 表示卡顿,1: 表示流畅,2: 表示非常流程
380
+ * @example
381
+ * jessibuca.on("performance",function(performance){console.log("performance is",performance)})
382
+ */
383
+ on(event: 'performance', callback: (performance: 0 | 1 | 2) => void): void;
384
+
385
+ /**
386
+ * 录制开始的事件
387
+ * @example
388
+ * jessibuca.on("recordStart",function(){console.log("record start")})
389
+ */
390
+ on(event: 'recordStart', callback: () => void): void;
391
+
392
+ /**
393
+ * 录制结束的事件
394
+ * @example
395
+ * jessibuca.on("recordEnd",function(){console.log("record end")})
396
+ */
397
+ on(event: 'recordEnd', callback: () => void): void;
398
+
399
+ /**
400
+ * 录制的时候,返回的录制时长,1s一次
401
+ * @example
402
+ * jessibuca.on("recordingTimestamp",function(timestamp){console.log("recordingTimestamp is",timestamp)})
403
+ */
404
+ on(event: 'recordingTimestamp', callback: (timestamp: number) => void): void;
405
+
406
+ /**
407
+ * 监听调用play方法 经过 初始化-> 网络请求-> 解封装 -> 解码 -> 渲染 一系列过程的时间消耗
408
+ * @param event
409
+ * @param callback
410
+ */
411
+ on(event: 'playToRenderTimes', callback: (times:{
412
+ playInitStart: number, // 1 初始化
413
+ playStart: number, // 2 初始化
414
+ streamStart: number, // 3 网络请求
415
+ streamResponse: number, // 4 网络请求
416
+ demuxStart: number, // 5 解封装
417
+ decodeStart: number, // 6 解码
418
+ videoStart: number, // 7 渲染
419
+ playTimestamp: number,// playStart- playInitStart
420
+ streamTimestamp: number,// streamStart - playStart
421
+ streamResponseTimestamp: number,// streamResponse - streamStart
422
+ demuxTimestamp: number, // demuxStart - streamResponse
423
+ decodeTimestamp: number, // decodeStart - demuxStart
424
+ videoTimestamp: number,// videoStart - decodeStart
425
+ allTimestamp: number // videoStart - playInitStart
426
+ }) => void): void
427
+
428
+ /**
429
+ * 监听方法
430
+ *
431
+ @example
432
+ jessibuca.on("load",function(){console.log('load')})
433
+ */
434
+ on(event: string, callback: () =>void): void;
435
+
436
+ }
437
+
438
+ type Config = {
439
+ /**
440
+ * 播放器容器
441
+ * * 若为 string ,则底层调用的是 document.getElementById('id')
442
+ * */
443
+ container: HTMLElement | string;
444
+ /**
445
+ * 设置最大缓冲时长,单位秒,播放器会自动消除延迟
446
+ */
447
+ videoBuffer?: number;
448
+ /**
449
+ * worker地址
450
+ * * 默认引用的是根目录下面的decoder.js文件 ,decoder.js 与 decoder.wasm文件必须是放在同一个目录下面。 */
451
+ decoder?: string;
452
+ /**
453
+ * 是否不使用离屏模式(提升渲染能力)
454
+ */
455
+ forceNoOffscreen?: boolean;
456
+ /**
457
+ * 是否开启当页面的'visibilityState'变为'hidden'的时候,自动暂停播放。
458
+ */
459
+ hiddenAutoPause?: boolean;
460
+ /**
461
+ * 是否有音频,如果设置`false`,则不对音频数据解码,提升性能。
462
+ */
463
+ hasAudio?: boolean;
464
+ /**
465
+ * 设置旋转角度,只支持,0(默认),180,270 三个值
466
+ */
467
+ rotate?: boolean;
468
+ /**
469
+ * 1. 当为`true`的时候:视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边。 等同于 `setScaleMode(1)`
470
+ * 2. 当为`false`的时候:视频画面完全填充canvas区域,画面会被拉伸。等同于 `setScaleMode(0)`
471
+ */
472
+ isResize?: boolean;
473
+ /**
474
+ * 1. 当为`true`的时候:视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全。等同于 `setScaleMode(2)`
475
+ */
476
+ isFullSize?: boolean;
477
+ /**
478
+ * 1. 当为`true`的时候:ws协议不检验是否以.flv为依据,进行协议解析。
479
+ */
480
+ isFlv?: boolean;
481
+ /**
482
+ * 是否开启控制台调试打
483
+ */
484
+ debug?: boolean;
485
+ /**
486
+ * 1. 设置超时时长, 单位秒
487
+ * 2. 在连接成功之前(loading)和播放中途(heart),如果超过设定时长无数据返回,则回调timeout事件
488
+ */
489
+ timeout?: number;
490
+ /**
491
+ * 1. 设置超时时长, 单位秒
492
+ * 2. 在连接成功之前,如果超过设定时长无数据返回,则回调timeout事件
493
+ */
494
+ heartTimeout?: number;
495
+ /**
496
+ * 1. 设置超时时长, 单位秒
497
+ * 2. 在连接成功之前,如果超过设定时长无数据返回,则回调timeout事件
498
+ */
499
+ loadingTimeout?: number;
500
+ /**
501
+ * 是否支持屏幕的双击事件,触发全屏,取消全屏事件
502
+ */
503
+ supportDblclickFullscreen?: boolean;
504
+ /**
505
+ * 是否显示网
506
+ */
507
+ showBandwidth?: boolean;
508
+ /**
509
+ * 配置操作按钮
510
+ */
511
+ operateBtns?: {
512
+ /** 是否显示全屏按钮 */
513
+ fullscreen?: boolean;
514
+ /** 是否显示截图按钮 */
515
+ screenshot?: boolean;
516
+ /** 是否显示播放暂停按钮 */
517
+ play?: boolean;
518
+ /** 是否显示声音按钮 */
519
+ audio?: boolean;
520
+ /** 是否显示录制按 */
521
+ record?: boolean;
522
+ };
523
+ /**
524
+ * 开启屏幕常亮,在手机浏览器上, canvas标签渲染视频并不会像video标签那样保持屏幕常亮
525
+ */
526
+ keepScreenOn?: boolean;
527
+ /**
528
+ * 是否开启声音,默认是关闭声音播放的
529
+ */
530
+ isNotMute?: boolean;
531
+ /**
532
+ * 加载过程中文案
533
+ */
534
+ loadingText?: boolean;
535
+ /**
536
+ * 背景图片
537
+ */
538
+ background?: string;
539
+ /**
540
+ * 是否开启MediaSource硬解码
541
+ * * 视频编码只支持H.264视频(Safari on iOS不支持)
542
+ * * 不支持 forceNoOffscreen 为 false (开启离屏渲染)
543
+ */
544
+ useMSE?: boolean;
545
+ /**
546
+ * 是否开启Webcodecs硬解码
547
+ * * 视频编码只支持H.264视频 (需在chrome 94版本以上,需要https或者localhost环境)
548
+ * * 支持 forceNoOffscreen 为 false (开启离屏渲染)
549
+ * */
550
+ useWCS?: boolean;
551
+ /**
552
+ * 是否开启键盘快捷键
553
+ * 目前支持的键盘快捷键有:esc -> 退出全屏;arrowUp -> 声音增加;arrowDown -> 声音减少;
554
+ */
555
+ hotKey?: boolean;
556
+ };
@@ -4,6 +4,7 @@ declare class VtxHlsPlayerManager {
4
4
  url: any;
5
5
  video: any;
6
6
  player: any;
7
+ timer: NodeJS.Timeout;
7
8
  initPlayer(): void;
8
9
  /**
9
10
  * 倍速播放
@@ -18,6 +18,7 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
18
18
  this.url = opt.url;
19
19
  this.video = opt.video;
20
20
  this.player = null;
21
+ this.timer = null;
21
22
  this.initPlayer();
22
23
  } //初始化视频插件
23
24
 
@@ -32,16 +33,15 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
32
33
  maxLiveSyncPlaybackRate: 1.5
33
34
  });
34
35
  this.player = hls;
35
- var timer = null;
36
36
  this.player.on(Hls.Events.ERROR, function (evt, data) {
37
37
  if (data.type === Hls.ErrorTypes.MEDIA_ERROR) {
38
38
  _this.player.recoverMediaError();
39
39
  } else if (data.fatal) {
40
- timer && clearTimeout(timer);
40
+ _this.timer && clearTimeout(_this.timer);
41
41
 
42
42
  _this.player.destroy();
43
43
 
44
- timer = setTimeout(function () {
44
+ _this.timer = setTimeout(function () {
45
45
  return _this.initPlayer(video);
46
46
  }, 300);
47
47
  }
@@ -75,6 +75,7 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
75
75
  if (this.player) {
76
76
  this.player.destroy();
77
77
  this.player = null;
78
+ this.timer = null;
78
79
  }
79
80
  }
80
81
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"PlayerManager.js","names":["VtxHlsPlayerManager","opt","url","video","player","initPlayer","hls","Hls","maxLiveSyncPlaybackRate","timer","on","Events","ERROR","evt","data","type","ErrorTypes","MEDIA_ERROR","recoverMediaError","fatal","clearTimeout","destroy","setTimeout","MEDIA_ATTACHED","loadSource","MANIFEST_PARSED","play","attachMedia","speed","recordPlayer","playSpeed","setSize","fullScreen","playerAdapter","setPlayerAdapter","number","setPlayerNum","index","setSelectIndex"],"sources":["vtxHls/PlayerManager.js"],"sourcesContent":["class VtxHlsPlayerManager {\n constructor(opt) {\n this.url = opt.url;\n this.video = opt.video;\n this.player = null;\n this.initPlayer();\n }\n //初始化视频插件\n initPlayer() {\n const video = this.video;\n const hls = new Hls({\n maxLiveSyncPlaybackRate: 1.5,\n });\n this.player = hls;\n let timer = null;\n this.player.on(Hls.Events.ERROR, (evt, data) => {\n if (data.type === Hls.ErrorTypes.MEDIA_ERROR) {\n this.player.recoverMediaError();\n }\n else if (data.fatal) {\n timer && clearTimeout(timer);\n this.player.destroy();\n timer = setTimeout(() => this.initPlayer(video), 300);\n }\n });\n this.player.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.player.loadSource(`${this.url}index.m3u8`);\n });\n this.player.on(Hls.Events.MANIFEST_PARSED, () => {\n video.play();\n });\n this.player.attachMedia(video);\n }\n /**\n * 倍速播放\n * @param {number} speed 速率 0.125 0.25 0.5 1 2 4 8 共7种速率\n */\n playSpeed(speed) {\n this.recordPlayer && this.recordPlayer.playSpeed(speed);\n }\n /**\n * 关闭播放器\n * @param {number} index 可选,关闭指定索引的窗口的播放器,不传则表示关闭所有播放器\n */\n close() {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n }\n resize() {\n this.player && this.player.setSize();\n }\n /**\n * 设置全屏\n */\n setFullScreen() {\n this.player.fullScreen();\n }\n /**\n * 设置窗口自适应还是拉伸\n * @param {string} playerAdapter selfAdaption 自适应 | stretching 拉伸\n */\n setPlayerAdapter(playerAdapter) {\n this.player.setPlayerAdapter(playerAdapter);\n }\n /**\n * 控制视频播放器显示的路数: 1 4 9 16 25,不会超过最大显示路数\n * @param {number} number\n */\n setPlayerNum(number) {\n this.player.setPlayerNum(number);\n }\n /**\n * 设置选中的播放器的索引\n * @param {number} index\n */\n setSelectIndex(index) {\n this.player.setSelectIndex(index);\n }\n}\nexport default VtxHlsPlayerManager;\n"],"mappings":";;;;;;;;;;;;;IAAMA,mB;EACF,6BAAYC,GAAZ,EAAiB;IAAA;;IACb,KAAKC,GAAL,GAAWD,GAAG,CAACC,GAAf;IACA,KAAKC,KAAL,GAAaF,GAAG,CAACE,KAAjB;IACA,KAAKC,MAAL,GAAc,IAAd;IACA,KAAKC,UAAL;EACH,C,CACD;;;;;WACA,sBAAa;MAAA;;MACT,IAAMF,KAAK,GAAG,KAAKA,KAAnB;MACA,IAAMG,GAAG,GAAG,IAAIC,GAAJ,CAAQ;QAChBC,uBAAuB,EAAE;MADT,CAAR,CAAZ;MAGA,KAAKJ,MAAL,GAAcE,GAAd;MACA,IAAIG,KAAK,GAAG,IAAZ;MACA,KAAKL,MAAL,CAAYM,EAAZ,CAAeH,GAAG,CAACI,MAAJ,CAAWC,KAA1B,EAAiC,UAACC,GAAD,EAAMC,IAAN,EAAe;QAC5C,IAAIA,IAAI,CAACC,IAAL,KAAcR,GAAG,CAACS,UAAJ,CAAeC,WAAjC,EAA8C;UAC1C,KAAI,CAACb,MAAL,CAAYc,iBAAZ;QACH,CAFD,MAGK,IAAIJ,IAAI,CAACK,KAAT,EAAgB;UACjBV,KAAK,IAAIW,YAAY,CAACX,KAAD,CAArB;;UACA,KAAI,CAACL,MAAL,CAAYiB,OAAZ;;UACAZ,KAAK,GAAGa,UAAU,CAAC;YAAA,OAAM,KAAI,CAACjB,UAAL,CAAgBF,KAAhB,CAAN;UAAA,CAAD,EAA+B,GAA/B,CAAlB;QACH;MACJ,CATD;MAUA,KAAKC,MAAL,CAAYM,EAAZ,CAAeH,GAAG,CAACI,MAAJ,CAAWY,cAA1B,EAA0C,YAAM;QAC5C,KAAI,CAACnB,MAAL,CAAYoB,UAAZ,WAA0B,KAAI,CAACtB,GAA/B;MACH,CAFD;MAGA,KAAKE,MAAL,CAAYM,EAAZ,CAAeH,GAAG,CAACI,MAAJ,CAAWc,eAA1B,EAA2C,YAAM;QAC7CtB,KAAK,CAACuB,IAAN;MACH,CAFD;MAGA,KAAKtB,MAAL,CAAYuB,WAAZ,CAAwBxB,KAAxB;IACH;IACD;AACJ;AACA;AACA;;;;WACI,mBAAUyB,KAAV,EAAiB;MACb,KAAKC,YAAL,IAAqB,KAAKA,YAAL,CAAkBC,SAAlB,CAA4BF,KAA5B,CAArB;IACH;IACD;AACJ;AACA;AACA;;;;WACI,iBAAQ;MACJ,IAAI,KAAKxB,MAAT,EAAiB;QACb,KAAKA,MAAL,CAAYiB,OAAZ;QACA,KAAKjB,MAAL,GAAc,IAAd;MACH;IACJ;;;WACD,kBAAS;MACL,KAAKA,MAAL,IAAe,KAAKA,MAAL,CAAY2B,OAAZ,EAAf;IACH;IACD;AACJ;AACA;;;;WACI,yBAAgB;MACZ,KAAK3B,MAAL,CAAY4B,UAAZ;IACH;IACD;AACJ;AACA;AACA;;;;WACI,0BAAiBC,aAAjB,EAAgC;MAC5B,KAAK7B,MAAL,CAAY8B,gBAAZ,CAA6BD,aAA7B;IACH;IACD;AACJ;AACA;AACA;;;;WACI,sBAAaE,MAAb,EAAqB;MACjB,KAAK/B,MAAL,CAAYgC,YAAZ,CAAyBD,MAAzB;IACH;IACD;AACJ;AACA;AACA;;;;WACI,wBAAeE,KAAf,EAAsB;MAClB,KAAKjC,MAAL,CAAYkC,cAAZ,CAA2BD,KAA3B;IACH;;;;;;eAEUrC,mB"}
1
+ {"version":3,"file":"PlayerManager.js","names":["VtxHlsPlayerManager","opt","url","video","player","timer","initPlayer","hls","Hls","maxLiveSyncPlaybackRate","on","Events","ERROR","evt","data","type","ErrorTypes","MEDIA_ERROR","recoverMediaError","fatal","clearTimeout","destroy","setTimeout","MEDIA_ATTACHED","loadSource","MANIFEST_PARSED","play","attachMedia","speed","recordPlayer","playSpeed","setSize","fullScreen","playerAdapter","setPlayerAdapter","number","setPlayerNum","index","setSelectIndex"],"sources":["vtxHls/PlayerManager.js"],"sourcesContent":["class VtxHlsPlayerManager {\n constructor(opt) {\n this.url = opt.url;\n this.video = opt.video;\n this.player = null;\n this.timer = null;\n this.initPlayer();\n }\n //初始化视频插件\n initPlayer() {\n const video = this.video;\n const hls = new Hls({\n maxLiveSyncPlaybackRate: 1.5,\n });\n this.player = hls;\n this.player.on(Hls.Events.ERROR, (evt, data) => {\n if (data.type === Hls.ErrorTypes.MEDIA_ERROR) {\n this.player.recoverMediaError();\n }\n else if (data.fatal) {\n this.timer && clearTimeout(this.timer);\n this.player.destroy();\n this.timer = setTimeout(() => this.initPlayer(video), 300);\n }\n });\n this.player.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.player.loadSource(`${this.url}index.m3u8`);\n });\n this.player.on(Hls.Events.MANIFEST_PARSED, () => {\n video.play();\n });\n this.player.attachMedia(video);\n }\n /**\n * 倍速播放\n * @param {number} speed 速率 0.125 0.25 0.5 1 2 4 8 共7种速率\n */\n playSpeed(speed) {\n this.recordPlayer && this.recordPlayer.playSpeed(speed);\n }\n /**\n * 关闭播放器\n * @param {number} index 可选,关闭指定索引的窗口的播放器,不传则表示关闭所有播放器\n */\n close() {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n this.timer = null;\n }\n }\n resize() {\n this.player && this.player.setSize();\n }\n /**\n * 设置全屏\n */\n setFullScreen() {\n this.player.fullScreen();\n }\n /**\n * 设置窗口自适应还是拉伸\n * @param {string} playerAdapter selfAdaption 自适应 | stretching 拉伸\n */\n setPlayerAdapter(playerAdapter) {\n this.player.setPlayerAdapter(playerAdapter);\n }\n /**\n * 控制视频播放器显示的路数: 1 4 9 16 25,不会超过最大显示路数\n * @param {number} number\n */\n setPlayerNum(number) {\n this.player.setPlayerNum(number);\n }\n /**\n * 设置选中的播放器的索引\n * @param {number} index\n */\n setSelectIndex(index) {\n this.player.setSelectIndex(index);\n }\n}\nexport default VtxHlsPlayerManager;\n"],"mappings":";;;;;;;;;;;;;IAAMA,mB;EACF,6BAAYC,GAAZ,EAAiB;IAAA;;IACb,KAAKC,GAAL,GAAWD,GAAG,CAACC,GAAf;IACA,KAAKC,KAAL,GAAaF,GAAG,CAACE,KAAjB;IACA,KAAKC,MAAL,GAAc,IAAd;IACA,KAAKC,KAAL,GAAa,IAAb;IACA,KAAKC,UAAL;EACH,C,CACD;;;;;WACA,sBAAa;MAAA;;MACT,IAAMH,KAAK,GAAG,KAAKA,KAAnB;MACA,IAAMI,GAAG,GAAG,IAAIC,GAAJ,CAAQ;QAChBC,uBAAuB,EAAE;MADT,CAAR,CAAZ;MAGA,KAAKL,MAAL,GAAcG,GAAd;MACA,KAAKH,MAAL,CAAYM,EAAZ,CAAeF,GAAG,CAACG,MAAJ,CAAWC,KAA1B,EAAiC,UAACC,GAAD,EAAMC,IAAN,EAAe;QAC5C,IAAIA,IAAI,CAACC,IAAL,KAAcP,GAAG,CAACQ,UAAJ,CAAeC,WAAjC,EAA8C;UAC1C,KAAI,CAACb,MAAL,CAAYc,iBAAZ;QACH,CAFD,MAGK,IAAIJ,IAAI,CAACK,KAAT,EAAgB;UACjB,KAAI,CAACd,KAAL,IAAce,YAAY,CAAC,KAAI,CAACf,KAAN,CAA1B;;UACA,KAAI,CAACD,MAAL,CAAYiB,OAAZ;;UACA,KAAI,CAAChB,KAAL,GAAaiB,UAAU,CAAC;YAAA,OAAM,KAAI,CAAChB,UAAL,CAAgBH,KAAhB,CAAN;UAAA,CAAD,EAA+B,GAA/B,CAAvB;QACH;MACJ,CATD;MAUA,KAAKC,MAAL,CAAYM,EAAZ,CAAeF,GAAG,CAACG,MAAJ,CAAWY,cAA1B,EAA0C,YAAM;QAC5C,KAAI,CAACnB,MAAL,CAAYoB,UAAZ,WAA0B,KAAI,CAACtB,GAA/B;MACH,CAFD;MAGA,KAAKE,MAAL,CAAYM,EAAZ,CAAeF,GAAG,CAACG,MAAJ,CAAWc,eAA1B,EAA2C,YAAM;QAC7CtB,KAAK,CAACuB,IAAN;MACH,CAFD;MAGA,KAAKtB,MAAL,CAAYuB,WAAZ,CAAwBxB,KAAxB;IACH;IACD;AACJ;AACA;AACA;;;;WACI,mBAAUyB,KAAV,EAAiB;MACb,KAAKC,YAAL,IAAqB,KAAKA,YAAL,CAAkBC,SAAlB,CAA4BF,KAA5B,CAArB;IACH;IACD;AACJ;AACA;AACA;;;;WACI,iBAAQ;MACJ,IAAI,KAAKxB,MAAT,EAAiB;QACb,KAAKA,MAAL,CAAYiB,OAAZ;QACA,KAAKjB,MAAL,GAAc,IAAd;QACA,KAAKC,KAAL,GAAa,IAAb;MACH;IACJ;;;WACD,kBAAS;MACL,KAAKD,MAAL,IAAe,KAAKA,MAAL,CAAY2B,OAAZ,EAAf;IACH;IACD;AACJ;AACA;;;;WACI,yBAAgB;MACZ,KAAK3B,MAAL,CAAY4B,UAAZ;IACH;IACD;AACJ;AACA;AACA;;;;WACI,0BAAiBC,aAAjB,EAAgC;MAC5B,KAAK7B,MAAL,CAAY8B,gBAAZ,CAA6BD,aAA7B;IACH;IACD;AACJ;AACA;AACA;;;;WACI,sBAAaE,MAAb,EAAqB;MACjB,KAAK/B,MAAL,CAAYgC,YAAZ,CAAyBD,MAAzB;IACH;IACD;AACJ;AACA;AACA;;;;WACI,wBAAeE,KAAf,EAAsB;MAClB,KAAKjC,MAAL,CAAYkC,cAAZ,CAA2BD,KAA3B;IACH;;;;;;eAEUrC,mB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vtx/player",
3
- "version": "1.6.2",
3
+ "version": "1.6.6",
4
4
  "private": false,
5
5
  "description": "视频业务组件",
6
6
  "main": "./lib/index.js",