@besovideo/webrtc-player 0.9.83 → 0.9.85

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.
package/README.md CHANGED
@@ -1,616 +1,616 @@
1
- # @besovideo/webrtc-player
2
-
3
- ![npm](https://img.shields.io/npm/v/@besovideo/webrtc-player) ![NPM](https://img.shields.io/npm/l/@besovideo/webrtc-player) ![npm](https://img.shields.io/npm/dt/@besovideo/webrtc-player)
4
-
5
- [![NPM](https://nodei.co/npm/@besovideo/webrtc-player.png)](https://nodei.co/npm/@besovideo/webrtc-player/)
6
-
7
- ## 简介 Introduction
8
-
9
- > 设备视频播放、对讲封装
10
- [Webrtc 与 平台接口关系](README.webrtc.md)
11
-
12
- ## 安装 Installation
13
-
14
- **use npm**
15
-
16
- ```shell
17
- npm i @besovideo/webrtc-player
18
- ```
19
-
20
- **use yarn**
21
-
22
- ```
23
- yarn add @besovideo/webrtc-player
24
- ```
25
-
26
- ## 示例 Example
27
-
28
- **视频**
29
-
30
- ```typescript
31
- import {
32
- PuPlayer,
33
- IPuPlayerProps,
34
- IPuPlayerInstance,
35
- clearAllDialog,
36
- } from "@besovideo/webrtc-player";
37
- import "@besovideo/webrtc-player/dist/main.es.css";
38
-
39
- const { instance } = PuPlayer({
40
- // (可选) 容器节点 注意一个容器内只能存在一个实例 当container为假值(包括false、null、undefined)时 将返回实例引用的dom节点 容器必须指定高度 参考高德地图
41
- container: document.getElementById("player_container"),
42
- // 必填 设备选项
43
- puOption: {
44
- // 设备id
45
- id: "PU_123456",
46
- // 设备通道号
47
- index: 0,
48
- },
49
- // 必填 用户授权令牌
50
- token: "Y3UrQ1VfYWRtestYDHYUAStest",
51
- // (可选) peer connection 连接媒体配置
52
- defaultMediaOption: {
53
- // 启用音频
54
- audio: true,
55
- // 启用视频
56
- video: true,
57
- },
58
- // (可选) 传输协议
59
- type: "webrtc" | "ws-bvrtc" | "auto";
60
- // (可选) 是否静音
61
- muted: false,
62
- // (可选) 指定video如何适应容器 (fill: 填充容器 ; contain :保持视频比例适应容器)
63
- videoFit: "fill",
64
- // (可选) 指定请求url路径前缀 可使用protocol+host 如:http://192.168.88.11:9780
65
- apiPrefix: "/test_api/prefix",
66
-
67
- // (可选) 用于测试播放视频 (存在时优先使用url播放,为浏览器直接播放)
68
- // testUrl: "https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4",
69
- // (可选) 连接建立后回调
70
- onConnected: () => {},
71
- // (可选) 连接建立失败时的回调
72
- onConnectedFailed: () => {},
73
- // (可选) 连接断开后回调
74
- onDisConnected: () => {},
75
- // (可选) token 失效回调
76
- onTokenFail: () => void,
77
- // (可选) 双击是否全屏
78
- fullScreenOnDblclick: true,
79
- // (可选) 启用控制器
80
- enableController: false,
81
- // (可选) 禁用控制器的控制项 下面示例中禁用了云台控制
82
- disabledControls: ["ptzControl"],
83
- // (可选) 设置最大重连间隔(s),默认不自动重连,setDefaultProps设置的maxReconnectInterval高于props
84
- maxReconnectInterval: 30,
85
- // (可选) 设置webrtc下视频预览,当没有视频时有音频情况下,是否展示音频波形
86
- noVideoRendeAudioWaveform: false,
87
- // (可选) 设置语言支持中文zh、英文en,默认中文
88
- locale: "zh",
89
- // (可选) bvrtc配置
90
- bvrtcConfig: {
91
- // (可选) 是否启用webcodecs解码,默认启用
92
- enableWebcodes: boolean,
93
- // (可选) 设置解码实时性 范围 0-10, 0 -- 流畅性最大, 10 -- 实时性最大
94
- realTimeLevel: number
95
- }
96
- });
97
-
98
- // setVideoFit 更改videoFit
99
- instance.setVideoFit("contain");
100
- // setToken 更改请求时的token
101
- instance.setToken("newTTTTToken");
102
- // setPuOption 更改请求的设备信息
103
- instance.setPuOption({
104
- id: "PU_12345test",
105
- index: 123,
106
- });
107
- // setApiPrefix 更改请求时的url前缀
108
- instance.setApiPrefix("/测试改前缀");
109
- // open 的可选参数muted如果为undefined, 是否静音将使用之前的状态
110
- // open 异步 先关闭再开始建立连接 (可选参数: muted:boolean = false 是否静音打开,可选参数: protocol = type 选择协议(type = "auto" | "webrtc" | "ws-bvrtc") 不填默认为auto)
111
- instance.open();
112
- // close 异步 释放dialog 并关闭 当前的 peer connection
113
- instance.close();
114
- // destroy 执行close 并从dom移除PuPlayer节点
115
- instance.destroy();
116
- // moveTo 将节点移动至新的容器
117
- instance.moveTo(document.getElementById("new_player_container"));
118
- // getCurrentContainer 获得当前所在的容器
119
- instance.getCurrentContainer();
120
- // hidden 隐藏 异步 (可选参数: muted?:boolean 是否静音 可不传)
121
- instance.hidden(true);
122
- // display 显示 (可选参数: muted?:boolean 是否静音 可不传)
123
- instance.display();
124
- // play 播放 异步
125
- instance.play();
126
- // mute 切换静音 (可选参数: muted:boolean = false 是否静音)
127
- instance.mute(true);
128
- // 获取puPlayer的div
129
- instance.getPlayerElement();
130
- // 获取内部引用的video元素
131
- instance.getVideoElement();
132
-
133
- //播放器状态
134
- instance.playerStatus : {
135
- // 全屏状态管理
136
- fullscreen: {
137
- // 获取全屏状态
138
- Get(): boolean,
139
- // 设置全屏状态
140
- Set(boolean): void;
141
- // 添加事件监听
142
- addEventListener(handle: ((bFullscreen: boolean) => void)):void;
143
- // 移除事件监听
144
- removeEventListener(handle: ((bFullscreen: boolean) => void)):void;
145
- },
146
- volume: {
147
- // 获取音量 0 - 1 之间
148
- Get(): number,
149
- // 设置音量 0 - 1 之间
150
- Set(volume: number): void;
151
- // 添加事件监听
152
- addEventListener(handle: ((volume: number) => void)):void;
153
- // 移除事件监听
154
- removeEventListener(handle: ((volume: number) => void)):void;
155
- },
156
- information: {
157
- // 获取信息窗口显示状态,是否显示
158
- Get(): boolean,
159
- // 设置信息窗口显示状态,是否显示
160
- Set(bShow: boolean): void;
161
- // 添加事件监听
162
- addEventListener(handle: ((bShow: boolean) => void)):void;
163
- // 移除事件监听
164
- removeEventListener(handle: ((bShow: boolean) => void)):void;
165
- },
166
- record:{
167
- // 获取录像状态,是否在录像
168
- //"recordStart" 录像已经开始
169
- //"recordStop" 录像已结束
170
- Get(): {type: "recordStart" | "recordStop"},
171
- // 设置录像状态
172
- Set(status: {type: "recordStart" | "recordStop"}): void;
173
- // 添加事件监听, type == "recordStop" recordInfo 才有值
174
- addEventListener(handle: ((status: {
175
- type: "recordStart" | "recordStop",
176
- recordInfo?: {
177
- data: Blob; // 数据
178
- startTime: number; // 录像开始时间 utc ms
179
- endTime: number; // 录像结束时间 utc ms
180
- duration: number; // 录像时长 ms
181
- fileName: string; // 文件名
182
- puOptions: {
183
- id: string; // 设备名称
184
- index: number; // 通道ID
185
- name?: string; //设备名称,用于内部UI显示
186
- indexName?: string; //通道名称,用于内部UI显示
187
- },
188
- //调用将取消自动下载,返回下载函数
189
- cancelAutoDownload: () => {
190
- //调用该接口,浏览器下载文件, filename 不填为默认的文件名,否则为[filename].webm
191
- download(filename?: string): void;
192
- }
193
- }
194
- }) => void)):void;
195
- // 移除事件监听
196
- removeEventListener(handle: ((status: {
197
- type: "recordStart" | "recordStop",
198
- recordInfo?: {
199
- data: Blob; // 数据
200
- startTime: number; // 录像开始时间 utc ms
201
- endTime: number; // 录像结束时间 utc ms
202
- duration: number; // 录像时长 ms
203
- fileName: string; // 文件名
204
- puOptions: {
205
- id: string; // 设备名称
206
- index: number; // 通道ID
207
- name?: string; //设备名称,用于内部UI显示
208
- indexName?: string; //通道名称,用于内部UI显示
209
- },
210
- //调用将取消自动下载,返回下载函数
211
- cancelAutoDownload: () => {
212
- //调用该接口,浏览器下载文件, filename 不填为默认的文件名,否则为[filename].webm
213
- download(filename?: string): void;
214
- }
215
- }
216
- }) => void)):void;
217
- },
218
- rotate: {
219
- // 获取旋转状态,顺时针方向
220
- // "Rotate0" 0度
221
- // "Rotate90" 90度
222
- // "Rotate180" 180度
223
- // "Rotate270" 270度
224
- Get(): {type: "Rotate0" | "Rotate90" | "Rotate180" | "Rotate270"},
225
- // 设置画面旋转状态
226
- Set(status: {type: "Rotate0" | "Rotate90" | "Rotate180" | "Rotate270"}): void;
227
- // 添加事件监听
228
- addEventListener(handle: ((status: {type: "Rotate0" | "Rotate90" | "Rotate180" | "Rotate270"}) => void)):void;
229
- // 移除事件监听
230
- removeEventListener(handle: ((status: {type: "Rotate0" | "Rotate90" | "Rotate180" | "Rotate270"}) => void)):void;
231
- },
232
- ptzControl: {
233
- // 获取云台控制面板显示状态,是否显示
234
- Get(): {show?: boolean},
235
- // 设置云台控制面板显示状态
236
- Set(status: {show?: boolean}): void;
237
- // 添加事件监听
238
- addEventListener(handle: ((status: {show: boolean})) => void)):void;
239
- // 移除事件监听
240
- removeEventListener(handle: ((status: {show: boolean})) => void)):void;
241
- },
242
- mike: {
243
- // 获取对讲状态,是否在对讲
244
- Get(): {talking?: boolean},
245
- // 设置对讲状态
246
- Set(status: {talking?: boolean}): void;
247
- // 添加事件监听
248
- addEventListener(handle: ((status: {talking?: boolean})) => void)):void;
249
- // 移除事件监听
250
- removeEventListener(handle: ((status: {talking?: boolean})) => void)):void;
251
- },
252
- screenshot:{
253
- //进行截图
254
- exec(): void;
255
- // 添加事件监听,获取截图结果,
256
- // cancelAutoDownload 函数,调用会取消掉下载图片
257
- addEventListener(handle: ((
258
- status: {
259
- img?: Blob,
260
- fileName?: string,
261
- cancelAutoDownload?: ()=>{
262
- download(fileName?: string): void //下载图片
263
- }
264
- })) => void)):void;
265
- // 移除事件监听
266
- removeEventListener(handle: ((
267
- status: {
268
- img?: Blob,
269
- fileName?: string,
270
- cancelAutoDownload?: ()=>{
271
- download(fileName?: string): void //下载图片
272
- }
273
- })) => void)):void;
274
- },
275
- informationGet: () => Promise<{
276
- //音频统计信息
277
- audio?: {
278
- //编码相关
279
- codec: {
280
- //https://developer.mozilla.org/en-US/docs/Web/API/RTCCodecStats/channels
281
- channels?: number; //通道数
282
- //https://developer.mozilla.org/en-US/docs/Web/API/RTCCodecStats/clockRate
283
- clockRate: number; //时钟频率
284
- //https://developer.mozilla.org/en-US/docs/Web/API/RTCCodecStats/mimeType
285
- mimeType: string; //mimetype
286
- //https://developer.mozilla.org/en-US/docs/Web/API/RTCCodecStats/sdpFmtpLine
287
- sdpFmtpLine?: string;
288
- };
289
- //传输相关
290
- rtp: {
291
- sampleRates: string; //采样率
292
- bitRate: number; //bit速率
293
- packageLostTotal: number; //丢包总数
294
- avaragePackageLostRate: number; //平均丢包率
295
- packageLostRate: number; //瞬时丢包率
296
- };
297
- };
298
- //视频统计信息
299
- video?: {
300
- //编码相关
301
- codec: {
302
- type: string; //编码类型 video/H264 video/H265 (webcodec)
303
- sampleRates: number; //采样率
304
- width: number; //视频宽度
305
- height: number; //视频高度
306
- };
307
- //传输相关
308
- rtp: {
309
- sampleRates: number; //视频采样率
310
- bitRate: number; //bit 率
311
- packageLostTotal: number; //总丢包数
312
- avaragePackageLostRate: number; //平均丢包率
313
- packageLostRate: number; //瞬时丢包率
314
- };
315
- };
316
-
317
- // 播放相关
318
- meta: {
319
- lastSeconds: number; //持续时间 秒数
320
- transType: "webrtc" | "bvrtc"; //传输方式
321
- };
322
- }>
323
- }
324
-
325
- // clearAllDialog 异步 释放全部打开的dialog 不管是音视频还是对讲
326
- clearAllDialog();
327
- ```
328
-
329
- - Controls 控制项列表
330
-
331
- ```typescript
332
- // 全部控制项
333
- [
334
- "fullscreen",
335
- "ptzControl",
336
- "rotate",
337
- "record",
338
- "screenshot",
339
- "volumeSlider",
340
- "volume",
341
- "mike",
342
- "information"
343
- ];
344
- // 在创建实例时 传入参数disabledControls数组 可关闭相关功能
345
- // 如不使用全屏按钮、云台控制器
346
- disabledControls: ["fullscreen", "ptzControl"];
347
- ```
348
-
349
- **对讲**
350
-
351
- ```typescript
352
- import {
353
- Intercom,
354
- IIntercomProps,
355
- IIntercomInstance,
356
- } from "@besovideo/webrtc-player";
357
- import "@besovideo/webrtc-player/dist/main.es.css";
358
-
359
- const { instance } = Intercom({
360
- // 必填 设备选项
361
- puOption: {
362
- // 设备id
363
- id: "PU_123456",
364
- // 设备通道号
365
- index: 0,
366
- },
367
- // 必填 用户授权令牌
368
- token: "Y3UrQ1VfYWRtestYDHYUAStest",
369
- // (可选) 连接建立后回调
370
- onConnected: () => {},
371
- // (可选) 连接建立失败时的回调
372
- onConnectedFailed: () => {},
373
- // (可选) 连接断开后回调
374
- onDisConnected: () => {},
375
- //(可选) 无法获取用户麦克风时
376
- onGetUserMediaFailed: () => {},
377
- // (可选) 指定请求url的前缀 方便代理请求
378
- apiPrefix: "/test_api/prefix",
379
- });
380
-
381
- // open 异步 先关闭再开始建立连接 (可选参数: protocol = type 选择协议(type = "auto" | "webrtc" | "ws-bvrtc") 不填默认为auto)
382
- install.open(type);
383
- ```
384
-
385
- **会议**
386
-
387
- ```typescript
388
- import {
389
- Conference,
390
- IConferenceProps,
391
- IConferenceInstance,
392
- } from "@besovideo/webrtc-player";
393
- import "@besovideo/webrtc-player/dist/main.es.css";
394
-
395
- const { instance } = Conference({
396
- // 必填 设备选项
397
- confOption: {
398
- // 会议id
399
- id: "test89312",
400
- // 会议成员ID
401
- index: 0,
402
- },
403
- // 必填 用户授权令牌
404
- token: "Y3UrQ1VfYWRtestYDHYUAStest",
405
- // (可选) 连接建立后回调
406
- onConnected: () => {},
407
- // (可选) 连接建立失败时的回调
408
- onConnectedFailed: () => {},
409
- // (可选) 连接断开后回调
410
- onDisConnected: () => {},
411
- //(可选) 无法获取用户麦克风时
412
- onGetUserMediaFailed: () => {},
413
- // (可选) 指定请求url的前缀 方便代理请求
414
- // apiPrefix: "/test_api/prefix",
415
- });
416
-
417
- // open 异步 先关闭再开始建立连接 (可选参数: protocol = type 选择协议(type = "auto" | "webrtc" | "ws-bvrtc") 不填默认为auto)
418
- install.open(type);
419
- ```
420
-
421
-
422
- **视频回放**
423
-
424
- ```typescript
425
- import {PlayBack} from "@besovideo/webrtc-player";
426
-
427
- const { instance } = PlayBack({
428
- // 必填 文件ID
429
- fileID: string;
430
- // 必填 文件名选填,控件下载文件时会使用这个,不填将是 【请填写Filename】
431
- fileName?: string;
432
- //必填 登录的token
433
- token: string;
434
- // 必填 设备ID 或者 NRUID, 填写PUID就是从设备回放文件,填写NRUID 就是从平台回放
435
- puOption?: {
436
- puId?: string;
437
- nruId?: string;
438
- },
439
-
440
- // (可选) 内部访问平台接口的路径前缀
441
- apiPrefix?: string;
442
- // (可选) type 参数为 "ws-bvrtc" 时的播放控制
443
- bvrtcConfig?: {
444
- // (可选) 是否使用webcodecs解码,用于h265解码硬件加速,兼容性没有软解好
445
- enableWebcodes?: number,
446
- // (可选) 设置解码实时性 范围 0-10, 0 -- 流畅性最大, 10 -- 实时性最大
447
- realTimeLevel?: number,
448
- },
449
- //(可选) 控制 回放 是否 音频 或者 视频, 默认打开全部轨道
450
- defaultMediaOption?: { audio: boolean, video: boolean },
451
- // 必填 父容器传递个div就行了
452
- container: HTMLDivElement;
453
-
454
- //(可选)语言 默认中文
455
- locale?: "zh" | "en",
456
- // 可选 默认 web 回放方式 "ws-bvrtc" (兼容性强,非原生) | "web"(原生,有些媒体文件播不了)
457
- type?: "ws-bvrtc" | "web",
458
- //(可选) 右键菜单的zindex 排序,有时候右键菜单 显示不出来
459
- zIndexMenu?: number,
460
-
461
- //(可选) 控制是否显示弹幕,默认显示
462
- displayMode?: 'playback'
463
- })
464
-
465
- // 打开回放
466
- instance.open()
467
-
468
- ```
469
-
470
-
471
- **Vue 示例**
472
-
473
- ```vue
474
- <template>
475
- <div ref="testRef" class="container"></div>
476
- <div ref="test2Ref" class="container2"></div>
477
- <button @click="close">关闭</button>
478
- </template>
479
-
480
- <script lang="ts">
481
- import { defineComponent, onMounted, ref } from "vue";
482
- import { PuPlayer, IPuPlayerInstance } from "@besovideo/webrtc-player";
483
- import "@besovideo/webrtc-player/dist/main.es.css";
484
-
485
- export default defineComponent({
486
- name: "Test",
487
- props: {
488
- // 设备id号
489
- puId: {
490
- type: String,
491
- required: true,
492
- },
493
- // 设备通道号
494
- index: {
495
- type: Number,
496
- required: true,
497
- },
498
- },
499
- setup(props) {
500
- const testRef = ref(null);
501
- const test2Ref = ref(null);
502
- const instanceRef = ref<IPuPlayerInstance | null>(null);
503
-
504
- const init = async () => {
505
- const { instance } = PuPlayer({
506
- container: testRef.value,
507
- puOption: { id: props.puId, index: props.index },
508
- token:
509
- "Y3UrQ1VfYWRtaW4rYWRtaW4rMTQzOSsxOTMwMTUrMTYyNTIwMjU3OCthN2I0Y2JiZDliMzkwZWUy",
510
- });
511
- console.log("初始化播放器完成:", instance);
512
- instanceRef.value = instance;
513
-
514
- try {
515
- await instance.open();
516
- } catch (e) {}
517
-
518
- setTimeout(() => {
519
- // 测试移动到另一个容器内
520
- console.log("移动节点");
521
- instance.moveTo(test2Ref.value);
522
- }, 5000);
523
- };
524
-
525
- onMounted(() => {
526
- init();
527
- });
528
-
529
- return {
530
- testRef,
531
- test2Ref,
532
- close: () => instanceRef.value?.close(),
533
- };
534
- },
535
- });
536
- </script>
537
-
538
- <style lang="scss" scoped>
539
- .container {
540
- height: 300px;
541
- }
542
- </style>
543
- ```
544
-
545
- **特别说明**
546
-
547
- - 项目是原生 JS、JQuery 写的,项目中没有导入导出功能的,可以使用暴露出来的"bvPlayer"实例对象进行使用
548
-
549
- - 在项目中引入 besovideo/webrtc-player dist 文件夹下面的"main.browser.css"和"main.browser.js"两个文件
550
- ```html
551
- <!DOCTYPE html>
552
- <html lang="en">
553
- <head>
554
- <link href="./main.browser.css" type="text/css" rel="stylesheet" />
555
- <meta charset="UTF-8" />
556
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
557
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
558
- <script src="./main.browser.js"/>
559
-
560
- <title>Document</title>
561
- </head>
562
- <body>
563
-
564
-
565
- </body>
566
-
567
- <script>
568
- const playerEle = document.createElement("div")
569
- playerEle.style.height = "300px"
570
- playerEle.style.width = "300px"
571
- playerEle.style.backgroundColor = "black"
572
- document.body.appendChild(playerEle);
573
- const {instance} = window.bvPlayer.PuPlayer({
574
- // (可选) 容器节点 注意一个容器内只能存在一个实例 当container为假值(包括false、null、undefined)时 将返回实例引用的dom节点 容器必须指定高度 参考高德地图
575
- container: playerEle,
576
- // 必填 设备选项
577
- puOption: {
578
- // 设备id
579
- id: "PU_123456",
580
- // 设备通道号
581
- index: 0,
582
- },
583
- // 必填 用户授权令牌
584
- token: "Y3UrQ1VfYWRtestYDHYUAStest",
585
- });
586
- instance.open()
587
- </script>
588
- </html>
589
-
590
- ```
591
- ## 升级 Upgrade
592
-
593
- ```shell
594
- yarn upgrade @besovideo/webrtc-player@latest
595
-
596
- ```
597
-
598
- ## 开发 Dev
599
-
600
- ```shell
601
- # 开发运行
602
- yarn
603
- yarn start
604
-
605
- # 打包和发布(可直接使用 make publish )
606
- # npm login / yarn login
607
- yarn version
608
- yarn build
609
- yarn publish
610
- # 版本号按照 Major.Minor.Patch 规范
611
- # 可参考https://www.jianshu.com/p/c675121a8bfd
612
-
613
-
614
- ```
615
-
616
- [环境变量切换方式](https://github.com/entropitor/dotenv-cli/pull/44)
1
+ # @besovideo/webrtc-player
2
+
3
+ ![npm](https://img.shields.io/npm/v/@besovideo/webrtc-player) ![NPM](https://img.shields.io/npm/l/@besovideo/webrtc-player) ![npm](https://img.shields.io/npm/dt/@besovideo/webrtc-player)
4
+
5
+ [![NPM](https://nodei.co/npm/@besovideo/webrtc-player.png)](https://nodei.co/npm/@besovideo/webrtc-player/)
6
+
7
+ ## 简介 Introduction
8
+
9
+ > 设备视频播放、对讲封装
10
+ [Webrtc 与 平台接口关系](README.webrtc.md)
11
+
12
+ ## 安装 Installation
13
+
14
+ **use npm**
15
+
16
+ ```shell
17
+ npm i @besovideo/webrtc-player
18
+ ```
19
+
20
+ **use yarn**
21
+
22
+ ```
23
+ yarn add @besovideo/webrtc-player
24
+ ```
25
+
26
+ ## 示例 Example
27
+
28
+ **视频**
29
+
30
+ ```typescript
31
+ import {
32
+ PuPlayer,
33
+ IPuPlayerProps,
34
+ IPuPlayerInstance,
35
+ clearAllDialog,
36
+ } from "@besovideo/webrtc-player";
37
+ import "@besovideo/webrtc-player/dist/main.es.css";
38
+
39
+ const { instance } = PuPlayer({
40
+ // (可选) 容器节点 注意一个容器内只能存在一个实例 当container为假值(包括false、null、undefined)时 将返回实例引用的dom节点 容器必须指定高度 参考高德地图
41
+ container: document.getElementById("player_container"),
42
+ // 必填 设备选项
43
+ puOption: {
44
+ // 设备id
45
+ id: "PU_123456",
46
+ // 设备通道号
47
+ index: 0,
48
+ },
49
+ // 必填 用户授权令牌
50
+ token: "Y3UrQ1VfYWRtestYDHYUAStest",
51
+ // (可选) peer connection 连接媒体配置
52
+ defaultMediaOption: {
53
+ // 启用音频
54
+ audio: true,
55
+ // 启用视频
56
+ video: true,
57
+ },
58
+ // (可选) 传输协议
59
+ type: "webrtc" | "ws-bvrtc" | "auto";
60
+ // (可选) 是否静音
61
+ muted: false,
62
+ // (可选) 指定video如何适应容器 (fill: 填充容器 ; contain :保持视频比例适应容器)
63
+ videoFit: "fill",
64
+ // (可选) 指定请求url路径前缀 可使用protocol+host 如:http://192.168.88.11:9780
65
+ apiPrefix: "/test_api/prefix",
66
+
67
+ // (可选) 用于测试播放视频 (存在时优先使用url播放,为浏览器直接播放)
68
+ // testUrl: "https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4",
69
+ // (可选) 连接建立后回调
70
+ onConnected: () => {},
71
+ // (可选) 连接建立失败时的回调
72
+ onConnectedFailed: () => {},
73
+ // (可选) 连接断开后回调
74
+ onDisConnected: () => {},
75
+ // (可选) token 失效回调
76
+ onTokenFail: () => void,
77
+ // (可选) 双击是否全屏
78
+ fullScreenOnDblclick: true,
79
+ // (可选) 启用控制器
80
+ enableController: false,
81
+ // (可选) 禁用控制器的控制项 下面示例中禁用了云台控制
82
+ disabledControls: ["ptzControl"],
83
+ // (可选) 设置最大重连间隔(s),默认不自动重连,setDefaultProps设置的maxReconnectInterval高于props
84
+ maxReconnectInterval: 30,
85
+ // (可选) 设置webrtc下视频预览,当没有视频时有音频情况下,是否展示音频波形
86
+ noVideoRendeAudioWaveform: false,
87
+ // (可选) 设置语言支持中文zh、英文en,默认中文
88
+ locale: "zh",
89
+ // (可选) bvrtc配置
90
+ bvrtcConfig: {
91
+ // (可选) 是否启用webcodecs解码,默认启用
92
+ enableWebcodes: boolean,
93
+ // (可选) 设置解码实时性 范围 0-10, 0 -- 流畅性最大, 10 -- 实时性最大
94
+ realTimeLevel: number
95
+ }
96
+ });
97
+
98
+ // setVideoFit 更改videoFit
99
+ instance.setVideoFit("contain");
100
+ // setToken 更改请求时的token
101
+ instance.setToken("newTTTTToken");
102
+ // setPuOption 更改请求的设备信息
103
+ instance.setPuOption({
104
+ id: "PU_12345test",
105
+ index: 123,
106
+ });
107
+ // setApiPrefix 更改请求时的url前缀
108
+ instance.setApiPrefix("/测试改前缀");
109
+ // open 的可选参数muted如果为undefined, 是否静音将使用之前的状态
110
+ // open 异步 先关闭再开始建立连接 (可选参数: muted:boolean = false 是否静音打开,可选参数: protocol = type 选择协议(type = "auto" | "webrtc" | "ws-bvrtc") 不填默认为auto)
111
+ instance.open();
112
+ // close 异步 释放dialog 并关闭 当前的 peer connection
113
+ instance.close();
114
+ // destroy 执行close 并从dom移除PuPlayer节点
115
+ instance.destroy();
116
+ // moveTo 将节点移动至新的容器
117
+ instance.moveTo(document.getElementById("new_player_container"));
118
+ // getCurrentContainer 获得当前所在的容器
119
+ instance.getCurrentContainer();
120
+ // hidden 隐藏 异步 (可选参数: muted?:boolean 是否静音 可不传)
121
+ instance.hidden(true);
122
+ // display 显示 (可选参数: muted?:boolean 是否静音 可不传)
123
+ instance.display();
124
+ // play 播放 异步
125
+ instance.play();
126
+ // mute 切换静音 (可选参数: muted:boolean = false 是否静音)
127
+ instance.mute(true);
128
+ // 获取puPlayer的div
129
+ instance.getPlayerElement();
130
+ // 获取内部引用的video元素
131
+ instance.getVideoElement();
132
+
133
+ //播放器状态
134
+ instance.playerStatus : {
135
+ // 全屏状态管理
136
+ fullscreen: {
137
+ // 获取全屏状态
138
+ Get(): boolean,
139
+ // 设置全屏状态
140
+ Set(boolean): void;
141
+ // 添加事件监听
142
+ addEventListener(handle: ((bFullscreen: boolean) => void)):void;
143
+ // 移除事件监听
144
+ removeEventListener(handle: ((bFullscreen: boolean) => void)):void;
145
+ },
146
+ volume: {
147
+ // 获取音量 0 - 1 之间
148
+ Get(): number,
149
+ // 设置音量 0 - 1 之间
150
+ Set(volume: number): void;
151
+ // 添加事件监听
152
+ addEventListener(handle: ((volume: number) => void)):void;
153
+ // 移除事件监听
154
+ removeEventListener(handle: ((volume: number) => void)):void;
155
+ },
156
+ information: {
157
+ // 获取信息窗口显示状态,是否显示
158
+ Get(): boolean,
159
+ // 设置信息窗口显示状态,是否显示
160
+ Set(bShow: boolean): void;
161
+ // 添加事件监听
162
+ addEventListener(handle: ((bShow: boolean) => void)):void;
163
+ // 移除事件监听
164
+ removeEventListener(handle: ((bShow: boolean) => void)):void;
165
+ },
166
+ record:{
167
+ // 获取录像状态,是否在录像
168
+ //"recordStart" 录像已经开始
169
+ //"recordStop" 录像已结束
170
+ Get(): {type: "recordStart" | "recordStop"},
171
+ // 设置录像状态
172
+ Set(status: {type: "recordStart" | "recordStop"}): void;
173
+ // 添加事件监听, type == "recordStop" recordInfo 才有值
174
+ addEventListener(handle: ((status: {
175
+ type: "recordStart" | "recordStop",
176
+ recordInfo?: {
177
+ data: Blob; // 数据
178
+ startTime: number; // 录像开始时间 utc ms
179
+ endTime: number; // 录像结束时间 utc ms
180
+ duration: number; // 录像时长 ms
181
+ fileName: string; // 文件名
182
+ puOptions: {
183
+ id: string; // 设备名称
184
+ index: number; // 通道ID
185
+ name?: string; //设备名称,用于内部UI显示
186
+ indexName?: string; //通道名称,用于内部UI显示
187
+ },
188
+ //调用将取消自动下载,返回下载函数
189
+ cancelAutoDownload: () => {
190
+ //调用该接口,浏览器下载文件, filename 不填为默认的文件名,否则为[filename].webm
191
+ download(filename?: string): void;
192
+ }
193
+ }
194
+ }) => void)):void;
195
+ // 移除事件监听
196
+ removeEventListener(handle: ((status: {
197
+ type: "recordStart" | "recordStop",
198
+ recordInfo?: {
199
+ data: Blob; // 数据
200
+ startTime: number; // 录像开始时间 utc ms
201
+ endTime: number; // 录像结束时间 utc ms
202
+ duration: number; // 录像时长 ms
203
+ fileName: string; // 文件名
204
+ puOptions: {
205
+ id: string; // 设备名称
206
+ index: number; // 通道ID
207
+ name?: string; //设备名称,用于内部UI显示
208
+ indexName?: string; //通道名称,用于内部UI显示
209
+ },
210
+ //调用将取消自动下载,返回下载函数
211
+ cancelAutoDownload: () => {
212
+ //调用该接口,浏览器下载文件, filename 不填为默认的文件名,否则为[filename].webm
213
+ download(filename?: string): void;
214
+ }
215
+ }
216
+ }) => void)):void;
217
+ },
218
+ rotate: {
219
+ // 获取旋转状态,顺时针方向
220
+ // "Rotate0" 0度
221
+ // "Rotate90" 90度
222
+ // "Rotate180" 180度
223
+ // "Rotate270" 270度
224
+ Get(): {type: "Rotate0" | "Rotate90" | "Rotate180" | "Rotate270"},
225
+ // 设置画面旋转状态
226
+ Set(status: {type: "Rotate0" | "Rotate90" | "Rotate180" | "Rotate270"}): void;
227
+ // 添加事件监听
228
+ addEventListener(handle: ((status: {type: "Rotate0" | "Rotate90" | "Rotate180" | "Rotate270"}) => void)):void;
229
+ // 移除事件监听
230
+ removeEventListener(handle: ((status: {type: "Rotate0" | "Rotate90" | "Rotate180" | "Rotate270"}) => void)):void;
231
+ },
232
+ ptzControl: {
233
+ // 获取云台控制面板显示状态,是否显示
234
+ Get(): {show?: boolean},
235
+ // 设置云台控制面板显示状态
236
+ Set(status: {show?: boolean}): void;
237
+ // 添加事件监听
238
+ addEventListener(handle: ((status: {show: boolean})) => void)):void;
239
+ // 移除事件监听
240
+ removeEventListener(handle: ((status: {show: boolean})) => void)):void;
241
+ },
242
+ mike: {
243
+ // 获取对讲状态,是否在对讲
244
+ Get(): {talking?: boolean},
245
+ // 设置对讲状态
246
+ Set(status: {talking?: boolean}): void;
247
+ // 添加事件监听
248
+ addEventListener(handle: ((status: {talking?: boolean})) => void)):void;
249
+ // 移除事件监听
250
+ removeEventListener(handle: ((status: {talking?: boolean})) => void)):void;
251
+ },
252
+ screenshot:{
253
+ //进行截图
254
+ exec(): void;
255
+ // 添加事件监听,获取截图结果,
256
+ // cancelAutoDownload 函数,调用会取消掉下载图片
257
+ addEventListener(handle: ((
258
+ status: {
259
+ img?: Blob,
260
+ fileName?: string,
261
+ cancelAutoDownload?: ()=>{
262
+ download(fileName?: string): void //下载图片
263
+ }
264
+ })) => void)):void;
265
+ // 移除事件监听
266
+ removeEventListener(handle: ((
267
+ status: {
268
+ img?: Blob,
269
+ fileName?: string,
270
+ cancelAutoDownload?: ()=>{
271
+ download(fileName?: string): void //下载图片
272
+ }
273
+ })) => void)):void;
274
+ },
275
+ informationGet: () => Promise<{
276
+ //音频统计信息
277
+ audio?: {
278
+ //编码相关
279
+ codec: {
280
+ //https://developer.mozilla.org/en-US/docs/Web/API/RTCCodecStats/channels
281
+ channels?: number; //通道数
282
+ //https://developer.mozilla.org/en-US/docs/Web/API/RTCCodecStats/clockRate
283
+ clockRate: number; //时钟频率
284
+ //https://developer.mozilla.org/en-US/docs/Web/API/RTCCodecStats/mimeType
285
+ mimeType: string; //mimetype
286
+ //https://developer.mozilla.org/en-US/docs/Web/API/RTCCodecStats/sdpFmtpLine
287
+ sdpFmtpLine?: string;
288
+ };
289
+ //传输相关
290
+ rtp: {
291
+ sampleRates: string; //采样率
292
+ bitRate: number; //bit速率
293
+ packageLostTotal: number; //丢包总数
294
+ avaragePackageLostRate: number; //平均丢包率
295
+ packageLostRate: number; //瞬时丢包率
296
+ };
297
+ };
298
+ //视频统计信息
299
+ video?: {
300
+ //编码相关
301
+ codec: {
302
+ type: string; //编码类型 video/H264 video/H265 (webcodec)
303
+ sampleRates: number; //采样率
304
+ width: number; //视频宽度
305
+ height: number; //视频高度
306
+ };
307
+ //传输相关
308
+ rtp: {
309
+ sampleRates: number; //视频采样率
310
+ bitRate: number; //bit 率
311
+ packageLostTotal: number; //总丢包数
312
+ avaragePackageLostRate: number; //平均丢包率
313
+ packageLostRate: number; //瞬时丢包率
314
+ };
315
+ };
316
+
317
+ // 播放相关
318
+ meta: {
319
+ lastSeconds: number; //持续时间 秒数
320
+ transType: "webrtc" | "bvrtc"; //传输方式
321
+ };
322
+ }>
323
+ }
324
+
325
+ // clearAllDialog 异步 释放全部打开的dialog 不管是音视频还是对讲
326
+ clearAllDialog();
327
+ ```
328
+
329
+ - Controls 控制项列表
330
+
331
+ ```typescript
332
+ // 全部控制项
333
+ [
334
+ "fullscreen",
335
+ "ptzControl",
336
+ "rotate",
337
+ "record",
338
+ "screenshot",
339
+ "volumeSlider",
340
+ "volume",
341
+ "mike",
342
+ "information"
343
+ ];
344
+ // 在创建实例时 传入参数disabledControls数组 可关闭相关功能
345
+ // 如不使用全屏按钮、云台控制器
346
+ disabledControls: ["fullscreen", "ptzControl"];
347
+ ```
348
+
349
+ **对讲**
350
+
351
+ ```typescript
352
+ import {
353
+ Intercom,
354
+ IIntercomProps,
355
+ IIntercomInstance,
356
+ } from "@besovideo/webrtc-player";
357
+ import "@besovideo/webrtc-player/dist/main.es.css";
358
+
359
+ const { instance } = Intercom({
360
+ // 必填 设备选项
361
+ puOption: {
362
+ // 设备id
363
+ id: "PU_123456",
364
+ // 设备通道号
365
+ index: 0,
366
+ },
367
+ // 必填 用户授权令牌
368
+ token: "Y3UrQ1VfYWRtestYDHYUAStest",
369
+ // (可选) 连接建立后回调
370
+ onConnected: () => {},
371
+ // (可选) 连接建立失败时的回调
372
+ onConnectedFailed: () => {},
373
+ // (可选) 连接断开后回调
374
+ onDisConnected: () => {},
375
+ //(可选) 无法获取用户麦克风时
376
+ onGetUserMediaFailed: () => {},
377
+ // (可选) 指定请求url的前缀 方便代理请求
378
+ apiPrefix: "/test_api/prefix",
379
+ });
380
+
381
+ // open 异步 先关闭再开始建立连接 (可选参数: protocol = type 选择协议(type = "auto" | "webrtc" | "ws-bvrtc") 不填默认为auto)
382
+ install.open(type);
383
+ ```
384
+
385
+ **会议**
386
+
387
+ ```typescript
388
+ import {
389
+ Conference,
390
+ IConferenceProps,
391
+ IConferenceInstance,
392
+ } from "@besovideo/webrtc-player";
393
+ import "@besovideo/webrtc-player/dist/main.es.css";
394
+
395
+ const { instance } = Conference({
396
+ // 必填 设备选项
397
+ confOption: {
398
+ // 会议id
399
+ id: "test89312",
400
+ // 会议成员ID
401
+ index: 0,
402
+ },
403
+ // 必填 用户授权令牌
404
+ token: "Y3UrQ1VfYWRtestYDHYUAStest",
405
+ // (可选) 连接建立后回调
406
+ onConnected: () => {},
407
+ // (可选) 连接建立失败时的回调
408
+ onConnectedFailed: () => {},
409
+ // (可选) 连接断开后回调
410
+ onDisConnected: () => {},
411
+ //(可选) 无法获取用户麦克风时
412
+ onGetUserMediaFailed: () => {},
413
+ // (可选) 指定请求url的前缀 方便代理请求
414
+ // apiPrefix: "/test_api/prefix",
415
+ });
416
+
417
+ // open 异步 先关闭再开始建立连接 (可选参数: protocol = type 选择协议(type = "auto" | "webrtc" | "ws-bvrtc") 不填默认为auto)
418
+ install.open(type);
419
+ ```
420
+
421
+
422
+ **视频回放**
423
+
424
+ ```typescript
425
+ import {PlayBack} from "@besovideo/webrtc-player";
426
+
427
+ const { instance } = PlayBack({
428
+ // 必填 文件ID
429
+ fileID: string;
430
+ // 必填 文件名选填,控件下载文件时会使用这个,不填将是 【请填写Filename】
431
+ fileName?: string;
432
+ //必填 登录的token
433
+ token: string;
434
+ // 必填 设备ID 或者 NRUID, 填写PUID就是从设备回放文件,填写NRUID 就是从平台回放
435
+ puOption?: {
436
+ puId?: string;
437
+ nruId?: string;
438
+ },
439
+
440
+ // (可选) 内部访问平台接口的路径前缀
441
+ apiPrefix?: string;
442
+ // (可选) type 参数为 "ws-bvrtc" 时的播放控制
443
+ bvrtcConfig?: {
444
+ // (可选) 是否使用webcodecs解码,用于h265解码硬件加速,兼容性没有软解好
445
+ enableWebcodes?: number,
446
+ // (可选) 设置解码实时性 范围 0-10, 0 -- 流畅性最大, 10 -- 实时性最大
447
+ realTimeLevel?: number,
448
+ },
449
+ //(可选) 控制 回放 是否 音频 或者 视频, 默认打开全部轨道
450
+ defaultMediaOption?: { audio: boolean, video: boolean },
451
+ // 必填 父容器传递个div就行了
452
+ container: HTMLDivElement;
453
+
454
+ //(可选)语言 默认中文
455
+ locale?: "zh" | "en",
456
+ // 可选 默认 web 回放方式 "ws-bvrtc" (兼容性强,非原生) | "web"(原生,有些媒体文件播不了)
457
+ type?: "ws-bvrtc" | "web",
458
+ //(可选) 右键菜单的zindex 排序,有时候右键菜单 显示不出来
459
+ zIndexMenu?: number,
460
+
461
+ //(可选) 控制是否显示弹幕,默认显示
462
+ displayMode?: 'playback'
463
+ })
464
+
465
+ // 打开回放
466
+ instance.open()
467
+
468
+ ```
469
+
470
+
471
+ **Vue 示例**
472
+
473
+ ```vue
474
+ <template>
475
+ <div ref="testRef" class="container"></div>
476
+ <div ref="test2Ref" class="container2"></div>
477
+ <button @click="close">关闭</button>
478
+ </template>
479
+
480
+ <script lang="ts">
481
+ import { defineComponent, onMounted, ref } from "vue";
482
+ import { PuPlayer, IPuPlayerInstance } from "@besovideo/webrtc-player";
483
+ import "@besovideo/webrtc-player/dist/main.es.css";
484
+
485
+ export default defineComponent({
486
+ name: "Test",
487
+ props: {
488
+ // 设备id号
489
+ puId: {
490
+ type: String,
491
+ required: true,
492
+ },
493
+ // 设备通道号
494
+ index: {
495
+ type: Number,
496
+ required: true,
497
+ },
498
+ },
499
+ setup(props) {
500
+ const testRef = ref(null);
501
+ const test2Ref = ref(null);
502
+ const instanceRef = ref<IPuPlayerInstance | null>(null);
503
+
504
+ const init = async () => {
505
+ const { instance } = PuPlayer({
506
+ container: testRef.value,
507
+ puOption: { id: props.puId, index: props.index },
508
+ token:
509
+ "Y3UrQ1VfYWRtaW4rYWRtaW4rMTQzOSsxOTMwMTUrMTYyNTIwMjU3OCthN2I0Y2JiZDliMzkwZWUy",
510
+ });
511
+ console.log("初始化播放器完成:", instance);
512
+ instanceRef.value = instance;
513
+
514
+ try {
515
+ await instance.open();
516
+ } catch (e) {}
517
+
518
+ setTimeout(() => {
519
+ // 测试移动到另一个容器内
520
+ console.log("移动节点");
521
+ instance.moveTo(test2Ref.value);
522
+ }, 5000);
523
+ };
524
+
525
+ onMounted(() => {
526
+ init();
527
+ });
528
+
529
+ return {
530
+ testRef,
531
+ test2Ref,
532
+ close: () => instanceRef.value?.close(),
533
+ };
534
+ },
535
+ });
536
+ </script>
537
+
538
+ <style lang="scss" scoped>
539
+ .container {
540
+ height: 300px;
541
+ }
542
+ </style>
543
+ ```
544
+
545
+ **特别说明**
546
+
547
+ - 项目是原生 JS、JQuery 写的,项目中没有导入导出功能的,可以使用暴露出来的"bvPlayer"实例对象进行使用
548
+
549
+ - 在项目中引入 besovideo/webrtc-player dist 文件夹下面的"main.browser.css"和"main.browser.js"两个文件
550
+ ```html
551
+ <!DOCTYPE html>
552
+ <html lang="en">
553
+ <head>
554
+ <link href="./main.browser.css" type="text/css" rel="stylesheet" />
555
+ <meta charset="UTF-8" />
556
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
557
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
558
+ <script src="./main.browser.js"/>
559
+
560
+ <title>Document</title>
561
+ </head>
562
+ <body>
563
+
564
+
565
+ </body>
566
+
567
+ <script>
568
+ const playerEle = document.createElement("div")
569
+ playerEle.style.height = "300px"
570
+ playerEle.style.width = "300px"
571
+ playerEle.style.backgroundColor = "black"
572
+ document.body.appendChild(playerEle);
573
+ const {instance} = window.bvPlayer.PuPlayer({
574
+ // (可选) 容器节点 注意一个容器内只能存在一个实例 当container为假值(包括false、null、undefined)时 将返回实例引用的dom节点 容器必须指定高度 参考高德地图
575
+ container: playerEle,
576
+ // 必填 设备选项
577
+ puOption: {
578
+ // 设备id
579
+ id: "PU_123456",
580
+ // 设备通道号
581
+ index: 0,
582
+ },
583
+ // 必填 用户授权令牌
584
+ token: "Y3UrQ1VfYWRtestYDHYUAStest",
585
+ });
586
+ instance.open()
587
+ </script>
588
+ </html>
589
+
590
+ ```
591
+ ## 升级 Upgrade
592
+
593
+ ```shell
594
+ yarn upgrade @besovideo/webrtc-player@latest
595
+
596
+ ```
597
+
598
+ ## 开发 Dev
599
+
600
+ ```shell
601
+ # 开发运行
602
+ yarn
603
+ yarn start
604
+
605
+ # 打包和发布(可直接使用 make publish )
606
+ # npm login / yarn login
607
+ yarn version
608
+ yarn build
609
+ yarn publish
610
+ # 版本号按照 Major.Minor.Patch 规范
611
+ # 可参考https://www.jianshu.com/p/c675121a8bfd
612
+
613
+
614
+ ```
615
+
616
+ [环境变量切换方式](https://github.com/entropitor/dotenv-cli/pull/44)