@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 +616 -616
- package/dist/main.browser.js +40 -11
- package/dist/main.es.js +40 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,616 +1,616 @@
|
|
|
1
|
-
# @besovideo/webrtc-player
|
|
2
|
-
|
|
3
|
-
  
|
|
4
|
-
|
|
5
|
-
[](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
|
+
  
|
|
4
|
+
|
|
5
|
+
[](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)
|