@sdk185/sip-phone-sdk26 0.2.4 → 0.2.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.
- package/dist/sip-phone-sdk.common.js +46 -45
- package/dist/sip-phone-sdk.css +1 -1
- package/dist/sip-phone-sdk.umd.js +46 -45
- package/dist/sip-phone-sdk.umd.min.js +5 -5
- package/package.json +1 -1
- package/src/App.vue +1 -1
- package/src/components/{MobilePhone copy.vue → MobilePhone-nl.vue} +418 -223
- package/src/components/{MobilePhone copy 2.vue → MobilePhone-ol.vue} +315 -243
- package/src/components/MobilePhone.vue +4 -4
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
<!-- 主模板:视频通话界面 -->
|
|
2
2
|
<template>
|
|
3
3
|
<!-- 主容器:使用flex垂直布局,内容居中对齐 -->
|
|
4
|
-
<div class="d-flex flex-column align-center justify-space-between sip-call-main">
|
|
5
|
-
<!-- 顶部提示信息 -->
|
|
6
|
-
<div style="position: absolute; top: 0; left: 0; background: transparent; color: #FFFFFF; width: 100%; z-index: 9999; height: 0; padding-top: 10px; padding-left: 10px;">
|
|
7
|
-
<!-- {{ prompt }} -->
|
|
8
|
-
</div>
|
|
4
|
+
<div class="phone-nmain d-flex flex-column align-center justify-space-between sip-call-main">
|
|
9
5
|
<!-- 位置信息显示区域 -->
|
|
10
6
|
<div class="location-wrapper" v-if="showLocation">
|
|
11
7
|
<!-- 显示经纬度和海拔信息 -->
|
|
@@ -14,21 +10,19 @@
|
|
|
14
10
|
<p>ALT: {{altitude}}</p>
|
|
15
11
|
</div>
|
|
16
12
|
<!-- 通话信息显示区域 -->
|
|
17
|
-
<div class="d-flex flex-column align-center" v-if="!miniMode && !showDialPad"
|
|
13
|
+
<div class="d-flex flex-column align-center call-btn" v-if="!miniMode && !showDialPad">
|
|
18
14
|
<!-- 应用logo -->
|
|
19
|
-
|
|
20
|
-
<img class="elevation-4" alt="logo" src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/normal-logo.png" width="72" height="72" style="border-radius: 50%;"/>
|
|
15
|
+
<img class="elevation-4 call-img" alt="logo" src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/normal-logo.png"/>
|
|
21
16
|
<!-- 通话状态提示 -->
|
|
22
|
-
<p class="mt-6 mb-0
|
|
17
|
+
<p class="mt-6 mb-0 call-label" >{{callPrompt}}</p>
|
|
23
18
|
</div>
|
|
24
|
-
|
|
25
19
|
<!-- 功能按钮区域 -->
|
|
26
|
-
<div class="pr-10 pl-10
|
|
20
|
+
<div class="pr-10 pl-10 " v-if="!miniMode && !showDialPad">
|
|
27
21
|
<v-row>
|
|
28
22
|
<v-col cols="12" class="text-center">
|
|
29
23
|
<!-- 通话计时器 -->
|
|
30
24
|
<div
|
|
31
|
-
v-show="isCalling && showHangup"
|
|
25
|
+
v-show="isCalling && showHangup" class="call-duration">
|
|
32
26
|
视频时长 {{duration}}
|
|
33
27
|
</div>
|
|
34
28
|
</v-col>
|
|
@@ -37,46 +31,23 @@
|
|
|
37
31
|
<v-row class="d-flex justify-space-around mb-10">
|
|
38
32
|
<!-- 取消按钮 - 用于微信公众号调用的场景 -->
|
|
39
33
|
<v-btn
|
|
40
|
-
|
|
34
|
+
class="cancel-btn"
|
|
35
|
+
style=" "
|
|
41
36
|
v-show="!isCalling && !needDial"
|
|
42
37
|
@click="onHangupBtnClick"
|
|
43
38
|
>
|
|
44
|
-
|
|
45
|
-
<
|
|
46
|
-
|
|
47
|
-
<span style="position: absolute; top: 78px; color: #FFFFFF;">取消</span>
|
|
39
|
+
<img class="cancel-img" src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/call-down.png" alt="hangup" >
|
|
40
|
+
<span class="cancel-label">取消</span>
|
|
48
41
|
</v-btn>
|
|
49
|
-
|
|
50
|
-
<!-- 原拨号按钮已注释,改为由微信公众号调用 -->
|
|
51
|
-
<!-- <v-btn
|
|
52
|
-
large
|
|
53
|
-
fab
|
|
54
|
-
color="#FFFFFF"
|
|
55
|
-
v-show="!isCalling && !needDial"
|
|
56
|
-
@click="onMakeCallBtnClick"
|
|
57
|
-
>
|
|
58
|
-
<v-icon>mdi-phone</v-icon>
|
|
59
|
-
<span class="btn-label">拨号</span>
|
|
60
|
-
</v-btn> -->
|
|
61
|
-
|
|
62
|
-
<!-- 麦克风静音/取消静音按钮 -->
|
|
63
|
-
<!-- 当正在通话且显示挂断按钮时显示 -->
|
|
64
|
-
<!-- 点击时触发onMuteBtnClick方法,传入'audio'参数 -->
|
|
65
42
|
<v-btn
|
|
66
43
|
large
|
|
67
44
|
v-show="isCalling && showHangup"
|
|
68
45
|
@click="onMuteBtnClick('audio')"
|
|
69
|
-
class="custom-mute-btn"
|
|
46
|
+
class="custom-mute-btn btn-box"
|
|
70
47
|
>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
<img v-else :src="require('@/assets/audio-close.png')" width="55" height="80"> -->
|
|
74
|
-
<img v-if="!isAudioMute" src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/adudio-open.png" width="55" height="80">
|
|
75
|
-
<img v-else src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/adudio-close.png" width="55" height="80">
|
|
76
|
-
<!-- 显示当前状态的文字提示 -->
|
|
77
|
-
<!-- <span class="btn-label">{{ isAudioMute ? '取消静音' : '静音' }}</span> -->
|
|
48
|
+
<img class="img-open-close" v-if="!isAudioMute" src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/adudio-open.png" >
|
|
49
|
+
<img class="img-open-close" v-else src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/adudio-close.png" >
|
|
78
50
|
</v-btn>
|
|
79
|
-
|
|
80
51
|
<!-- 摄像头开关按钮 -->
|
|
81
52
|
<v-btn
|
|
82
53
|
large
|
|
@@ -84,26 +55,10 @@
|
|
|
84
55
|
@click="onMuteBtnClick('video')"
|
|
85
56
|
class="custom-mute-btn"
|
|
86
57
|
>
|
|
87
|
-
|
|
88
|
-
<img v-else
|
|
89
|
-
<img v-if="!isVideoMute" src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/camera-open.png" alt="mic-on" width="55" height="80">
|
|
90
|
-
<img v-else src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/camera-close.png" alt="mic-off" width="55" height="80">
|
|
58
|
+
<img class="img-open-close" v-if="!isVideoMute" src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/camera-open.png" alt="mic-on">
|
|
59
|
+
<img class="img-open-close" v-else src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/camera-close.png" alt="mic-off">
|
|
91
60
|
</v-btn>
|
|
92
61
|
|
|
93
|
-
<!-- 显示/隐藏本地视频按钮 -->
|
|
94
|
-
<!-- <v-btn
|
|
95
|
-
style="opacity: .6"
|
|
96
|
-
color="blue-grey"
|
|
97
|
-
fab
|
|
98
|
-
large
|
|
99
|
-
dark
|
|
100
|
-
v-show="isCalling && showHangup"
|
|
101
|
-
@click="onShowLocalVideoBtnClick"
|
|
102
|
-
>
|
|
103
|
-
<v-icon v-if="localVideo.show">mdi-monitor</v-icon>
|
|
104
|
-
<v-icon v-else>mdi-monitor-multiple</v-icon>
|
|
105
|
-
<span class="btn-label">{{ localVideo.show ? '隐藏本地' : '显示本地' }}</span>
|
|
106
|
-
</v-btn> -->
|
|
107
62
|
</v-row>
|
|
108
63
|
|
|
109
64
|
<!-- 第二行按钮组 -->
|
|
@@ -114,14 +69,11 @@
|
|
|
114
69
|
v-show="isCalling && showHangup"
|
|
115
70
|
@click="onHangupBtnClick"
|
|
116
71
|
>
|
|
117
|
-
|
|
118
|
-
<
|
|
119
|
-
<span style="position: absolute; top: 73px; color: #FFFFFF;">挂断</span>
|
|
72
|
+
<img class="hangup-img" src="https://kefu-gm-jc-dat.boc-samsunglife.cn/static/call-down.png" alt="hangup">
|
|
73
|
+
<span class="hangup-label">挂断</span>
|
|
120
74
|
</v-btn>
|
|
121
|
-
|
|
122
75
|
<!-- 切换摄像头按钮 -->
|
|
123
76
|
<v-btn
|
|
124
|
-
style="opacity: .6; position: absolute; left: calc(50% + 80px);"
|
|
125
77
|
v-show="isCalling && showHangup"
|
|
126
78
|
@click="onSwitchCameraBtnClick"
|
|
127
79
|
class="transparent-btn"
|
|
@@ -130,7 +82,6 @@
|
|
|
130
82
|
</v-btn>
|
|
131
83
|
</v-row>
|
|
132
84
|
</div>
|
|
133
|
-
|
|
134
85
|
<!-- 视频容器区域 -->
|
|
135
86
|
<v-expand-transition>
|
|
136
87
|
<div class="sip-call-wrapper" v-show="showVideoCt" @click="onSipCallClick">
|
|
@@ -164,7 +115,7 @@
|
|
|
164
115
|
ref="remoteVideo"
|
|
165
116
|
class="sip-call-video"
|
|
166
117
|
style="object-fit: contain;"
|
|
167
|
-
|
|
118
|
+
|
|
168
119
|
></video>
|
|
169
120
|
</vue-draggable-resizable>
|
|
170
121
|
<!-- 本地视频窗口 -->
|
|
@@ -194,28 +145,11 @@
|
|
|
194
145
|
x5-video-orientation="h5"
|
|
195
146
|
ref="localVideo"
|
|
196
147
|
class="sip-call-video"
|
|
197
|
-
|
|
148
|
+
|
|
198
149
|
></video>
|
|
199
150
|
</vue-draggable-resizable>
|
|
200
|
-
|
|
201
|
-
<!-- 视频控制区域 -->
|
|
202
|
-
<!-- <template v-if="!miniMode">
|
|
203
|
-
通话计时器
|
|
204
|
-
<span class="video-timer">
|
|
205
|
-
<img :src="require('@/assets/icon_Recording_Fill_Red_Active.svg')" alt="icon" width="24" height="24" class="mr-2">
|
|
206
|
-
{{duration}}
|
|
207
|
-
</span>
|
|
208
|
-
|
|
209
|
-
全屏切换按钮
|
|
210
|
-
<v-btn class="camera-switch-btn" dark text x-small width="24" height="24" min-width="24" @click="onChangeVideoFullScreenBtnClick">
|
|
211
|
-
<v-icon>mdi-box-shadow</v-icon>
|
|
212
|
-
<span class="btn-label">全屏</span>
|
|
213
|
-
</v-btn>
|
|
214
|
-
</template> -->
|
|
215
|
-
|
|
216
151
|
</div>
|
|
217
152
|
</v-expand-transition>
|
|
218
|
-
|
|
219
153
|
<!-- 拨号盘组件 -->
|
|
220
154
|
<v-expand-transition>
|
|
221
155
|
<dial-panel-mini
|
|
@@ -228,12 +162,10 @@
|
|
|
228
162
|
ref="dialPanelMini"
|
|
229
163
|
/>
|
|
230
164
|
</v-expand-transition>
|
|
231
|
-
|
|
232
165
|
<!-- 音频播放器(用于播放提示音) -->
|
|
233
166
|
<v-bottom-sheet v-model="showAudioPlayer" hide-overlay>
|
|
234
167
|
<audio :src="require('@/assets/outgoing-call2.mp3')" loop ref="audioPlayer"></audio>
|
|
235
168
|
</v-bottom-sheet>
|
|
236
|
-
|
|
237
169
|
<!-- 提示信息弹窗 -->
|
|
238
170
|
<v-snackbar v-model="showSnackbar" :timeout="2000">
|
|
239
171
|
{{snackbarText}}
|
|
@@ -247,7 +179,7 @@ import SipMix from '@/libs/SIP_MIX_WEB'
|
|
|
247
179
|
import DialPanelMini from '@/components/DialPanelMini'
|
|
248
180
|
import VueDraggableResizable from 'vue-draggable-resizable'
|
|
249
181
|
import { closeStream } from '@/libs/tool'
|
|
250
|
-
|
|
182
|
+
import jsNative from 'js-native-n22'
|
|
251
183
|
|
|
252
184
|
export default {
|
|
253
185
|
name: 'MobilePhone',
|
|
@@ -321,7 +253,7 @@ export default {
|
|
|
321
253
|
miniMode: false,
|
|
322
254
|
dialNum: '',
|
|
323
255
|
|
|
324
|
-
controls: '',
|
|
256
|
+
//controls: '',
|
|
325
257
|
|
|
326
258
|
isAudioMute: false,
|
|
327
259
|
isVideoMute: false,
|
|
@@ -366,13 +298,13 @@ export default {
|
|
|
366
298
|
},
|
|
367
299
|
|
|
368
300
|
watch: {
|
|
369
|
-
isCalling (is) {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
},
|
|
301
|
+
// isCalling (is) {
|
|
302
|
+
// if (is) {
|
|
303
|
+
// this.startDurationCount()
|
|
304
|
+
// } else {
|
|
305
|
+
// this.stopDurationCount()
|
|
306
|
+
// }
|
|
307
|
+
// },
|
|
376
308
|
callId (id) {
|
|
377
309
|
this.lastCallId = id || this.lastCallId
|
|
378
310
|
},
|
|
@@ -400,6 +332,25 @@ export default {
|
|
|
400
332
|
},
|
|
401
333
|
|
|
402
334
|
methods: {
|
|
335
|
+
handleAndroidParams(val){
|
|
336
|
+
console.log("handleAndroidParamsvalvalval", val)
|
|
337
|
+
jsNative.bridge.callhandler('webRTC', '', (result) => {
|
|
338
|
+
console.log("%c调用原生返回成功", "color: green", result)
|
|
339
|
+
console.log("c调用原生返回成功valval", val)
|
|
340
|
+
if (!result.error) {
|
|
341
|
+
// success && success(result.content)
|
|
342
|
+
console.log('webRTC调用成功', result.content)
|
|
343
|
+
console.log('webRTC调用成功valval', val)
|
|
344
|
+
this.handleWechatParams(val);
|
|
345
|
+
} else {
|
|
346
|
+
// fail && fail(result.content)
|
|
347
|
+
console.log('webRTC调用失败', result.content)
|
|
348
|
+
console.log('webRTC调用失败valval', val)
|
|
349
|
+
}
|
|
350
|
+
})
|
|
351
|
+
},
|
|
352
|
+
|
|
353
|
+
|
|
403
354
|
// 处理微信公众号参数
|
|
404
355
|
handleWechatParams(val) {
|
|
405
356
|
// ===== 测试代码开始 =====
|
|
@@ -410,7 +361,7 @@ export default {
|
|
|
410
361
|
// // 获取参数值
|
|
411
362
|
// const calledNum = urlParams.get('calledNum');
|
|
412
363
|
// const callDataStr = urlParams.get('callData');
|
|
413
|
-
console.log('
|
|
364
|
+
console.log('e行销传过来的参数',val);
|
|
414
365
|
|
|
415
366
|
// ===== 原始代码(已注释) ===== // 用于微信公众号 此方式是获取url参数;父子组件传值可以使用props
|
|
416
367
|
// const urlParams = new URLSearchParams(window.location.search);
|
|
@@ -420,7 +371,7 @@ export default {
|
|
|
420
371
|
const calledNum = val.calledNum;
|
|
421
372
|
const callDataStr = val.callData;
|
|
422
373
|
|
|
423
|
-
console.log('测试模式:使用模拟参数');
|
|
374
|
+
// console.log('测试模式:使用模拟参数');
|
|
424
375
|
|
|
425
376
|
if (calledNum) {
|
|
426
377
|
// 存储被叫号码
|
|
@@ -591,12 +542,17 @@ export default {
|
|
|
591
542
|
}
|
|
592
543
|
|
|
593
544
|
const params = { target: this.dialNum }
|
|
545
|
+
console.log('paramsparams Data', params)
|
|
546
|
+
console.log('this.callData Data', this.callData)
|
|
547
|
+
console.log('window.config.videoParams', window.config.videoParams)
|
|
594
548
|
if (this.callType === 'videoOnly') {
|
|
549
|
+
console.log('videoOnly')
|
|
595
550
|
params.video = Object.assign({
|
|
596
551
|
facingMode: 'user'
|
|
597
552
|
}, window.config.videoParams)
|
|
598
553
|
params.audio = false
|
|
599
554
|
} else if (this.callType === 'video') {
|
|
555
|
+
console.log('video')
|
|
600
556
|
params.video = Object.assign({
|
|
601
557
|
facingMode: 'user'
|
|
602
558
|
}, window.config.videoParams)
|
|
@@ -608,6 +564,7 @@ export default {
|
|
|
608
564
|
|
|
609
565
|
if (this.callData) {
|
|
610
566
|
params.callData = this.callData
|
|
567
|
+
console.log('Call Da1ta', this.callData)
|
|
611
568
|
}
|
|
612
569
|
|
|
613
570
|
// console.info('Call Params', params)
|
|
@@ -629,7 +586,6 @@ export default {
|
|
|
629
586
|
}
|
|
630
587
|
|
|
631
588
|
},
|
|
632
|
-
|
|
633
589
|
onHangupBtnClick () {
|
|
634
590
|
this.sipMix.hangup();
|
|
635
591
|
// this.$emit('hangup-event', { imType: 0 });// 通知父组件
|
|
@@ -706,26 +662,67 @@ export default {
|
|
|
706
662
|
}, 1000)
|
|
707
663
|
},
|
|
708
664
|
|
|
665
|
+
// async onSwitchCameraBtnClick() {
|
|
666
|
+
// const list = await navigator.mediaDevices.enumerateDevices()
|
|
667
|
+
// console.warn(list)
|
|
668
|
+
// let videoOption = {
|
|
669
|
+
// facingMode: 'user',
|
|
670
|
+
// }
|
|
671
|
+
// if (this.cameraType === 'front') {
|
|
672
|
+
// videoOption = {
|
|
673
|
+
// facingMode: { exact: 'environment' }
|
|
674
|
+
// }
|
|
675
|
+
// }
|
|
676
|
+
// Object.assign(videoOption, window.config.videoParams)
|
|
677
|
+
|
|
678
|
+
// const stream = await navigator.mediaDevices.getUserMedia({
|
|
679
|
+
// video: videoOption,
|
|
680
|
+
// audio: false
|
|
681
|
+
// })
|
|
682
|
+
// if (stream) {
|
|
683
|
+
// this.cameraType = this.cameraType === 'front' ? 'back' : 'front'
|
|
684
|
+
// this.$refs.localVideo.srcObject = stream
|
|
685
|
+
// this.sipMix.changeLocalVideoTrack({stream})
|
|
686
|
+
// }
|
|
687
|
+
// },
|
|
709
688
|
async onSwitchCameraBtnClick() {
|
|
689
|
+
// 1. 获取当前设备列表(包含音频/视频输入设备)
|
|
710
690
|
const list = await navigator.mediaDevices.enumerateDevices()
|
|
711
|
-
console.warn(list)
|
|
712
|
-
|
|
713
|
-
|
|
691
|
+
console.warn(list) // 调试用:打印设备列表,可看到摄像头设备信息
|
|
692
|
+
|
|
693
|
+
// 2. 初始化摄像头配置(默认前置摄像头)
|
|
694
|
+
let videoOption = {
|
|
695
|
+
facingMode: 'user', // user = 前置摄像头(面向用户)
|
|
714
696
|
}
|
|
697
|
+
|
|
698
|
+
// 3. 切换摄像头配置:如果当前是前置,切换为后置
|
|
715
699
|
if (this.cameraType === 'front') {
|
|
716
700
|
videoOption = {
|
|
717
|
-
facingMode: { exact: 'environment' }
|
|
701
|
+
facingMode: { exact: 'environment' } // environment = 后置摄像头(面向环境)
|
|
718
702
|
}
|
|
719
703
|
}
|
|
704
|
+
|
|
705
|
+
// 4. 合并全局视频参数(比如分辨率、帧率等配置)
|
|
720
706
|
Object.assign(videoOption, window.config.videoParams)
|
|
721
707
|
|
|
708
|
+
// 5. 重新请求摄像头媒体流(只请求视频,不请求音频)
|
|
722
709
|
const stream = await navigator.mediaDevices.getUserMedia({
|
|
723
710
|
video: videoOption,
|
|
724
711
|
audio: false
|
|
725
712
|
})
|
|
713
|
+
|
|
714
|
+
// 6. 流获取成功后执行核心操作
|
|
726
715
|
if (stream) {
|
|
716
|
+
// ① 切换摄像头状态标记(front ↔ back)
|
|
727
717
|
this.cameraType = this.cameraType === 'front' ? 'back' : 'front'
|
|
718
|
+
|
|
719
|
+
// ② 更新本地video标签的流(这是视频画面显示的核心)
|
|
728
720
|
this.$refs.localVideo.srcObject = stream
|
|
721
|
+
|
|
722
|
+
// 本次新增修改点:强制显示本地视频
|
|
723
|
+
this.localVideo.show = true
|
|
724
|
+
|
|
725
|
+
// ③ 同步新的视频流到通话链路(让对方也看到切换后的画面)
|
|
729
726
|
this.sipMix.changeLocalVideoTrack({stream})
|
|
730
727
|
}
|
|
731
728
|
},
|
|
@@ -798,6 +795,7 @@ export default {
|
|
|
798
795
|
// 处理通话失败事件
|
|
799
796
|
this.sipMix.on('failed', (e) => {
|
|
800
797
|
console.warn('通话失败', e)
|
|
798
|
+
this.stopDurationCount() // 确保停止计时器 0105
|
|
801
799
|
this.dealCallEndOrFail() // 清理通话相关状态
|
|
802
800
|
this.callPrompt = this.$t('cancelled') // 显示通话已取消提示
|
|
803
801
|
|
|
@@ -817,6 +815,7 @@ export default {
|
|
|
817
815
|
// 处理通话结束事件(对方挂断或通话正常结束)
|
|
818
816
|
this.sipMix.on('ended', () => {
|
|
819
817
|
console.warn('通话结束')
|
|
818
|
+
this.stopDurationCount() // 确保停止计时器 0105
|
|
820
819
|
this.dealCallEndOrFail() // 清理通话相关状态
|
|
821
820
|
this.callPrompt = this.$t('hangedUp') // 显示通话已挂断提示
|
|
822
821
|
|
|
@@ -834,14 +833,18 @@ export default {
|
|
|
834
833
|
|
|
835
834
|
this.sipMix.on('localStream', async (stream, info) => {
|
|
836
835
|
console.info('localStream', stream, info)
|
|
836
|
+
this.$refs.localVideo.srcObject = stream
|
|
837
|
+
if(this.localVideo.show) {
|
|
838
|
+
return
|
|
839
|
+
}
|
|
837
840
|
this.localVideo.w = this.clientWidth
|
|
838
841
|
this.localVideo.h = this.clientHeight
|
|
839
842
|
this.localVideo.draggable = false
|
|
840
843
|
this.showVideoCt = true
|
|
841
844
|
this.localVideo.show = true
|
|
842
845
|
|
|
843
|
-
await this.$nextTick()
|
|
844
|
-
this.$refs.localVideo.srcObject = stream
|
|
846
|
+
// await this.$nextTick()
|
|
847
|
+
// this.$refs.localVideo.srcObject = stream
|
|
845
848
|
})
|
|
846
849
|
|
|
847
850
|
this.sipMix.on('remoteStream', (stream, info) => {
|
|
@@ -904,6 +907,7 @@ export default {
|
|
|
904
907
|
})
|
|
905
908
|
|
|
906
909
|
this.sipMix.on('confirmed', () => {
|
|
910
|
+
this.startDurationCount(); // 通话完全建立后开始计时 0105
|
|
907
911
|
this.startSendPosition()
|
|
908
912
|
})
|
|
909
913
|
|
|
@@ -989,6 +993,11 @@ export default {
|
|
|
989
993
|
})
|
|
990
994
|
|
|
991
995
|
setTimeout(() => {
|
|
996
|
+
// this.miniMode = false;// 调试用
|
|
997
|
+
// this.showDialPad = false;// 调试用
|
|
998
|
+
// this.isCalling = true;// 调试用
|
|
999
|
+
// this.needDial = false;// 调试用
|
|
1000
|
+
// this.showHangup = true;// 调试用
|
|
992
1001
|
const {clientHeight, clientWidth} = window.document.body
|
|
993
1002
|
this.clientHeight = clientHeight
|
|
994
1003
|
this.clientWidth = clientWidth
|
|
@@ -1010,158 +1019,221 @@ export default {
|
|
|
1010
1019
|
@import './vuetify.css';
|
|
1011
1020
|
</style> -->
|
|
1012
1021
|
<style lang="scss">
|
|
1013
|
-
.
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
.sip-call-wrapper {
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
}
|
|
1022
|
+
.phone-nmain{
|
|
1023
|
+
background-color: #737778;
|
|
1024
|
+
padding: 25% 10px 20% !important;
|
|
1025
|
+
width: 100vw;
|
|
1026
|
+
height: 100vh;
|
|
1027
|
+
overflow: hidden;
|
|
1028
|
+
|
|
1029
|
+
|
|
1030
|
+
.sip-call-wrapper {
|
|
1031
|
+
position: absolute;
|
|
1032
|
+
left: 0;
|
|
1033
|
+
top: 0;
|
|
1034
|
+
width: 100vw;
|
|
1035
|
+
height: 100vh;
|
|
1036
|
+
z-index: 100;
|
|
1037
|
+
}
|
|
1029
1038
|
|
|
1030
|
-
.btn-group {
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1039
|
+
.sip-btn-group {
|
|
1040
|
+
width: 100%;
|
|
1041
|
+
position: absolute;
|
|
1042
|
+
//bottom: 250px;
|
|
1043
|
+
bottom: 25%;
|
|
1044
|
+
z-index: 4000;
|
|
1045
|
+
}
|
|
1036
1046
|
|
|
1037
|
-
@media screen and (min-width: 1024px) {
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
}
|
|
1047
|
+
@media screen and (min-width: 1024px) {
|
|
1048
|
+
.sip-btn-group {
|
|
1049
|
+
position: absolute;
|
|
1050
|
+
bottom: 40px;
|
|
1051
|
+
width: 320px;
|
|
1052
|
+
z-index: 4000;
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1045
1055
|
|
|
1046
|
-
.sip-call-video {
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
}
|
|
1056
|
+
.sip-call-video {
|
|
1057
|
+
width: 100%;
|
|
1058
|
+
height: 100%;
|
|
1059
|
+
object-fit: cover;
|
|
1060
|
+
background-color: #000000;
|
|
1061
|
+
}
|
|
1052
1062
|
|
|
1053
|
-
.video-panel {
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
}
|
|
1063
|
+
.video-panel {
|
|
1064
|
+
position: absolute;
|
|
1065
|
+
display: flex;
|
|
1066
|
+
flex-direction: column;
|
|
1067
|
+
justify-content: space-around;
|
|
1068
|
+
align-items: center;
|
|
1069
|
+
}
|
|
1061
1070
|
|
|
1062
|
-
.video-timer {
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
}
|
|
1071
|
+
.video-timer {
|
|
1072
|
+
background-color: rgba(255,255,255,0.80);
|
|
1073
|
+
position: absolute;
|
|
1074
|
+
top: 40px;
|
|
1075
|
+
left: 16px;
|
|
1076
|
+
font-size: 14px;
|
|
1077
|
+
font-weight: bold;
|
|
1078
|
+
padding: 2px 8px 2px 6px;
|
|
1079
|
+
border-radius: 12px;
|
|
1080
|
+
z-index: 2000;
|
|
1081
|
+
display: flex;
|
|
1082
|
+
justify-content: space-around;
|
|
1083
|
+
align-items: center;
|
|
1084
|
+
}
|
|
1076
1085
|
|
|
1077
|
-
.video-switch-btn {
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
}
|
|
1086
|
+
.video-switch-btn {
|
|
1087
|
+
position: absolute !important;
|
|
1088
|
+
top: 40px;
|
|
1089
|
+
right: 80px;
|
|
1090
|
+
z-index: 2000;
|
|
1091
|
+
img {
|
|
1092
|
+
background-color: #000000;
|
|
1093
|
+
border-radius: 6px;
|
|
1094
|
+
border: 1px solid #000000;
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1088
1097
|
|
|
1089
|
-
.video-mini-mode {
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
}
|
|
1098
|
+
.video-mini-mode {
|
|
1099
|
+
position: absolute !important;
|
|
1100
|
+
top: 40px;
|
|
1101
|
+
right: 48px;
|
|
1102
|
+
z-index: 2000;
|
|
1103
|
+
}
|
|
1095
1104
|
|
|
1096
|
-
.camera-switch-btn {
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
}
|
|
1105
|
+
.camera-switch-btn {
|
|
1106
|
+
position: absolute !important;
|
|
1107
|
+
top: 40px;
|
|
1108
|
+
right: 16px;
|
|
1109
|
+
z-index: 2000;
|
|
1110
|
+
}
|
|
1102
1111
|
|
|
1103
|
-
.video-normal-mode {
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
}
|
|
1112
|
+
.video-normal-mode {
|
|
1113
|
+
position: absolute !important;
|
|
1114
|
+
top: 16px;
|
|
1115
|
+
right: 16px;
|
|
1116
|
+
z-index: 2000;
|
|
1117
|
+
}
|
|
1109
1118
|
|
|
1110
|
-
.location-wrapper {
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1119
|
+
.location-wrapper {
|
|
1120
|
+
position: absolute;
|
|
1121
|
+
top: 0;
|
|
1122
|
+
right: 0;
|
|
1123
|
+
width: 150px;
|
|
1124
|
+
background-color: #00000055;
|
|
1125
|
+
color: #FFFFFF;
|
|
1126
|
+
padding: 6px;
|
|
1127
|
+
p {
|
|
1128
|
+
font-size: 12px;
|
|
1129
|
+
margin: 0;
|
|
1130
|
+
padding: 0;
|
|
1131
|
+
width: 100%;
|
|
1132
|
+
white-space: nowrap;
|
|
1133
|
+
text-overflow: ellipsis;
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1125
1136
|
}
|
|
1126
|
-
}
|
|
1127
1137
|
</style>
|
|
1128
|
-
<style scoped>
|
|
1129
|
-
.
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1138
|
+
<style scoped lang="scss">
|
|
1139
|
+
.phone-nmain{
|
|
1140
|
+
.custom-mute-btn {
|
|
1141
|
+
background: transparent !important;
|
|
1142
|
+
box-shadow: none !important;
|
|
1143
|
+
z-index: 9999 !important;
|
|
1144
|
+
min-width: 0 !important;
|
|
1145
|
+
width: auto !important;
|
|
1146
|
+
height: auto !important;
|
|
1147
|
+
padding: 0 !important;
|
|
1148
|
+
margin: 0 !important;
|
|
1149
|
+
}
|
|
1139
1150
|
|
|
1140
|
-
/* 移除按钮悬停和激活状态的背景色 */
|
|
1141
|
-
.custom-mute-btn::before {
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
}
|
|
1151
|
+
/* 移除按钮悬停和激活状态的背景色 */
|
|
1152
|
+
.custom-mute-btn::before {
|
|
1153
|
+
background-color: transparent !important;
|
|
1154
|
+
opacity: 0 !important;
|
|
1155
|
+
}
|
|
1145
1156
|
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1157
|
+
.btn-box{
|
|
1158
|
+
padding: 0 90px !important; // 0113
|
|
1159
|
+
margin-left: -100px !important; // 0113
|
|
1160
|
+
}
|
|
1161
|
+
/* 移除按钮的点击效果 */
|
|
1162
|
+
.custom-mute-btn:hover::before,
|
|
1163
|
+
.custom-mute-btn:focus::before,
|
|
1164
|
+
.custom-mute-btn:active::before {
|
|
1165
|
+
opacity: 0 !important;
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
.transparent-btn {
|
|
1169
|
+
background: transparent !important;
|
|
1170
|
+
box-shadow: none !important;
|
|
1171
|
+
min-width: 0 !important;
|
|
1172
|
+
width: auto !important;
|
|
1173
|
+
height: auto !important;
|
|
1174
|
+
padding: 0 !important;
|
|
1175
|
+
margin: 0 !important;
|
|
1176
|
+
/* opacity: .6 !important; */
|
|
1177
|
+
position: absolute !important;
|
|
1178
|
+
left: calc(50% + 80px) !important;
|
|
1179
|
+
color: #FFFFFF !important;
|
|
1180
|
+
}
|
|
1181
|
+
.transparent-btn::before {
|
|
1182
|
+
background-color: transparent !important;
|
|
1183
|
+
opacity: 0 !important;
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
.call-btn{
|
|
1187
|
+
/* margin-top:160px; */
|
|
1188
|
+
position: relative;
|
|
1189
|
+
top: 0%;
|
|
1190
|
+
}
|
|
1191
|
+
.call-img{
|
|
1192
|
+
width:100px;
|
|
1193
|
+
height:100px;
|
|
1194
|
+
border-radius: 50%;
|
|
1195
|
+
}
|
|
1152
1196
|
|
|
1153
|
-
.transparent-btn {
|
|
1154
|
-
background: transparent !important;
|
|
1155
|
-
box-shadow: none !important;
|
|
1156
|
-
min-width: 0 !important;
|
|
1157
|
-
width: auto !important;
|
|
1158
|
-
height: auto !important;
|
|
1159
|
-
padding: 0 !important;
|
|
1160
|
-
margin: 0 !important;
|
|
1161
|
-
}
|
|
1162
|
-
.transparent-btn::before {
|
|
1163
|
-
background-color: transparent !important;
|
|
1164
|
-
opacity: 0 !important;
|
|
1165
|
-
}
|
|
1166
1197
|
|
|
1198
|
+
.call-label{
|
|
1199
|
+
font-size: 16px;
|
|
1200
|
+
color: #FFFFFF
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
.cancel-btn{
|
|
1204
|
+
opacity: 1;
|
|
1205
|
+
background: transparent !important;
|
|
1206
|
+
box-shadow: none !important;
|
|
1207
|
+
position: relative !important;
|
|
1208
|
+
margin-top: -50px !important;
|
|
1209
|
+
}
|
|
1210
|
+
.cancel-img {
|
|
1211
|
+
width: 80px;
|
|
1212
|
+
height: 80px;
|
|
1213
|
+
}
|
|
1214
|
+
.cancel-label{
|
|
1215
|
+
top: 78px;
|
|
1216
|
+
position: absolute; color: #FFFFFF;
|
|
1217
|
+
font-size: 16px;
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
.call-duration{
|
|
1222
|
+
font-size: 14px;margin-top: -12.5px; color: #FFFFFF;
|
|
1223
|
+
}
|
|
1224
|
+
.hangup-img{
|
|
1225
|
+
width: 80px;
|
|
1226
|
+
height: 80px;
|
|
1227
|
+
}
|
|
1228
|
+
.hangup-label{
|
|
1229
|
+
top: 73px;
|
|
1230
|
+
position: absolute; color: #FFFFFF;
|
|
1231
|
+
font-size: 14px;
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
.img-open-close{
|
|
1235
|
+
width: 55px;
|
|
1236
|
+
height: 80px;
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1167
1239
|
</style>
|