小度技术支持文档

小度技术支持文档


web视频通话demo_1.3.0

<h2>一 demo 文件</h2> <p>[<a href="https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2023-9/1694767402521/index.html.zip](https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2023-9/1694767402521/index.html.zip">https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2023-9/1694767402521/index.html.zip](https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2023-9/1694767402521/index.html.zip</a> &quot;<a href="https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2023-9/1694767402521/index.html.zip&quot">https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2023-9/1694767402521/index.html.zip&quot</a>;)</p> <h2>二、demo代码</h2> <pre><code class="language-html">&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt; &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot;&amp;gt; &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt; &amp;lt;title&amp;gt;web通话demo&amp;lt;/title&amp;gt; &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdn.bootcdn.net/ajax/libs/bootstrap-validator/0.5.3/css/bootstrapValidator.min.css&amp;quot;&amp;gt; &amp;lt;script src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2023-7/1689143438187/duerwebsdk-1.3.0.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&amp;quot;https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&amp;quot;https://cdn.bootcdn.net/ajax/libs/bootstrap-validator/0.5.3/js/bootstrapValidator.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&amp;quot;https://apps.bdimg.com/libs/bootstrap/3.2.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;link href=&amp;quot;https://apps.bdimg.com/libs/bootstrap/3.2.0/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&amp;quot;modal&amp;quot; role=&amp;quot;dialog&amp;quot; tabindex=&amp;quot;-1&amp;quot; style=&amp;quot;display: block;&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;modal-dialog&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;modal-content&amp;quot;&amp;gt; &amp;lt;!-- 建立长连接 --&amp;gt; &amp;lt;form role=&amp;quot;form&amp;quot; id=&amp;quot;login-form&amp;quot; class=&amp;quot;form-horizontal&amp;quot;&amp;gt; &amp;lt;h2 class=&amp;quot;desc-title&amp;quot;&amp;gt;RTC长连接&amp;lt;/h2&amp;gt; &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt; &amp;lt;label for=&amp;quot;name&amp;quot; class=&amp;quot;col-sm-2 control-label&amp;quot;&amp;gt;appId: &amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;col-sm-10&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; name=&amp;quot;appId&amp;quot; placeholder=&amp;quot;请输入appId&amp;quot; required&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt; &amp;lt;label for=&amp;quot;name&amp;quot; class=&amp;quot;col-sm-2 control-label&amp;quot;&amp;gt;uid: &amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;col-sm-10&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; name=&amp;quot;uid&amp;quot; placeholder=&amp;quot;请输入uid&amp;quot; required&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt; &amp;lt;label for=&amp;quot;name&amp;quot; class=&amp;quot;col-sm-2 control-label&amp;quot;&amp;gt;token: &amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;col-sm-10&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; name=&amp;quot;token&amp;quot; placeholder=&amp;quot;请输入token&amp;quot; required&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt; &amp;lt;label for=&amp;quot;name&amp;quot; class=&amp;quot;col-sm-2 control-label&amp;quot;&amp;gt;appName: &amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;col-sm-10&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; name=&amp;quot;appName&amp;quot; placeholder=&amp;quot;请输入appName&amp;quot; required&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;btn btn-primary col-sm-offset-2&amp;quot; onclick=&amp;quot;checkLoginForm()&amp;quot;&amp;gt;建立连接&amp;lt;/button&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;!-- 呼叫音箱表单信息 --&amp;gt; &amp;lt;form role=&amp;quot;form&amp;quot; id=&amp;quot;device-form&amp;quot; class=&amp;quot;form-horizontal&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt; &amp;lt;!-- 手动入席离席 --&amp;gt; &amp;lt;!-- &amp;lt;select id=&amp;quot;customer-select&amp;quot; name=&amp;quot;onlineStatus&amp;quot; placeholder=&amp;quot;请选择&amp;quot;&amp;gt; &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;入席&amp;lt;/option&amp;gt; &amp;lt;option value=&amp;quot;0&amp;quot;&amp;gt;离席&amp;lt;/option&amp;gt; &amp;lt;/select&amp;gt; --&amp;gt; &amp;lt;h2 class=&amp;quot;desc-title&amp;quot;&amp;gt;音箱呼叫&amp;lt;/h2&amp;gt; &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt; &amp;lt;label for=&amp;quot;appId&amp;quot; class=&amp;quot;col-sm-3 control-label&amp;quot;&amp;gt;appId:&amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;col-sm-9&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; name=&amp;quot;appId&amp;quot; placeholder=&amp;quot;请输入对端的appId&amp;quot;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt; &amp;lt;label for=&amp;quot;uid&amp;quot; class=&amp;quot;col-sm-3 control-label&amp;quot;&amp;gt;uid:&amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;col-sm-9&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; name=&amp;quot;uid&amp;quot; placeholder=&amp;quot;请输入对端的uid&amp;quot;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!--被叫方姓名,用于去电展示 --&amp;gt; &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt; &amp;lt;label for=&amp;quot;name&amp;quot; class=&amp;quot;col-sm-3 control-label&amp;quot;&amp;gt;被叫姓名:&amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;col-sm-9&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; name=&amp;quot;name&amp;quot; placeholder=&amp;quot;请输入对端的姓名&amp;quot;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt; &amp;lt;label for=&amp;quot;callMode&amp;quot; class=&amp;quot;col-sm-3 control-label&amp;quot;&amp;gt;呼叫方式:&amp;lt;/label&amp;gt; &amp;lt;div class=&amp;quot;col-sm-9&amp;quot;&amp;gt; &amp;lt;select class=&amp;quot;form-control&amp;quot; name=&amp;quot;callMode&amp;quot; placeholder=&amp;quot;请选择呼叫方式&amp;quot;&amp;gt; &amp;lt;option value=&amp;quot;0&amp;quot;&amp;gt;视频通话&amp;lt;/option&amp;gt; &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;语音通话&amp;lt;/option&amp;gt; &amp;lt;/select&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;btn btn-primary col-sm-offset-3&amp;quot; onclick=&amp;quot;checkCallForm()&amp;quot;&amp;gt;呼叫&amp;lt;/button&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 来电弹窗 --&amp;gt; &amp;lt;div role=&amp;quot;dialog&amp;quot; class=&amp;quot;modal fade&amp;quot; id=&amp;quot;incoming-call-dialog&amp;quot; tabindex=&amp;quot;-1&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;modal-dialog modal-dialog-centered&amp;quot; role=&amp;quot;document&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;modal-content&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;modal-body&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;usr-info&amp;quot;&amp;gt; &amp;lt;img class=&amp;quot;usr-pho&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-7/1658388218664/pho.png&amp;quot;&amp;gt; &amp;lt;!--用于来电展示,接入方通过来电sn查询获取来电姓名 --&amp;gt; &amp;lt;p class=&amp;quot;usr-name&amp;quot;&amp;gt;未知来电&amp;lt;/p&amp;gt; &amp;lt;p class=&amp;quot;incoming-call-tip&amp;quot;&amp;gt;邀请您通话&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;op-btns&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;incoming-call-reject&amp;quot;&amp;gt; &amp;lt;img onclick=&amp;quot;rejectCall()&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661433175110/reject.png&amp;quot; &amp;gt; &amp;lt;p class=&amp;quot;op-txt&amp;quot;&amp;gt;挂断&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;incoming-call-video&amp;quot;&amp;gt; &amp;lt;img onclick=&amp;quot;answerCall(0)&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661433226356/videoCall.png&amp;quot; &amp;gt; &amp;lt;p class=&amp;quot;op-txt&amp;quot;&amp;gt;视频通话&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;incoming-call-audio&amp;quot;&amp;gt; &amp;lt;img onclick=&amp;quot;answerCall(1)&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661433255465/audioCall.png&amp;quot; &amp;gt; &amp;lt;p class=&amp;quot;op-txt&amp;quot;&amp;gt;语音通话&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 去电响铃 --&amp;gt; &amp;lt;div id=&amp;quot;outing-call-view&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;peer-info&amp;quot;&amp;gt; &amp;lt;img class=&amp;quot;peer-pho&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-7/1658388218664/pho.png&amp;quot;&amp;gt; &amp;lt;!-- 业务方根据实际呼叫用户进行替换 --&amp;gt; &amp;lt;p class=&amp;quot;peer-name&amp;quot;&amp;gt;被叫名字&amp;lt;/p&amp;gt; &amp;lt;p class=&amp;quot;outing-call-tip&amp;quot;&amp;gt;设备正在响铃中,请不要挂断...&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;op-btns&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;out-call-mode&amp;quot;&amp;gt; &amp;lt;img onclick=&amp;quot;changeMode()&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661828922567/videoCall0.png&amp;quot; &amp;gt; &amp;lt;p class=&amp;quot;out-call-mode-txt&amp;quot;&amp;gt;视频呼叫&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- &amp;lt;div class=&amp;quot;out-call-mode&amp;quot;&amp;gt; &amp;lt;img onclick=&amp;quot;changeMode()&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515364706/audio000.png&amp;quot; &amp;gt; &amp;lt;p&amp;gt;语音呼叫&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; --&amp;gt; &amp;lt;div&amp;gt; &amp;lt;img onclick=&amp;quot;dropCall()&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661433175110/reject.png&amp;quot; &amp;gt; &amp;lt;p style=&amp;quot;color: #E24940&amp;quot;&amp;gt;挂断&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 通话界面 --&amp;gt; &amp;lt;div id=&amp;quot;call-view&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;peer-view main-view&amp;quot;&amp;gt; &amp;lt;video id='video-peer' autoPlay&amp;gt;&amp;lt;/video&amp;gt; &amp;lt;audio id='audio-peer' autoPlay&amp;gt;&amp;lt;/audio&amp;gt; &amp;lt;div class=&amp;quot;audio-tip-wrap&amp;quot;&amp;gt; &amp;lt;!-- &amp;lt;p class=&amp;quot;audio-name online-ellipsis&amp;quot;&amp;gt;对端姓名&amp;lt;/p&amp;gt; --&amp;gt; &amp;lt;p class=&amp;quot;audio-call&amp;quot;&amp;gt;语音通话中&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;local-view sub-view&amp;quot;&amp;gt; &amp;lt;video id='video-local' autoPlay&amp;gt;&amp;lt;/video&amp;gt; &amp;lt;audio id='audio-local' autoPlay&amp;gt;&amp;lt;/audio&amp;gt; &amp;lt;div class=&amp;quot;audio-tip-wrap&amp;quot;&amp;gt; &amp;lt;p class=&amp;quot;audio-name online-ellipsis&amp;quot;&amp;gt;本机&amp;lt;/p&amp;gt; &amp;lt;p class=&amp;quot;audio-call&amp;quot;&amp;gt;语音通话中&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;op-btns&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;mute-change-btn&amp;quot;&amp;gt; &amp;lt;img onclick=&amp;quot;changeMute()&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515279806/quite0.png&amp;quot; &amp;gt; &amp;lt;p class=&amp;quot;a-mute&amp;quot;&amp;gt;静音&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- &amp;lt;div&amp;gt; &amp;lt;img onclick=&amp;quot;changeAudioMute&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515279209/quite.png&amp;quot; &amp;gt; &amp;lt;p class=&amp;quot;a-mute&amp;quot;&amp;gt;已静音&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; --&amp;gt; &amp;lt;div class=&amp;quot;mode-change-btn&amp;quot;&amp;gt; &amp;lt;img onclick=&amp;quot;changeMode()&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661828922567/videoCall0.png&amp;quot; &amp;gt; &amp;lt;p class=&amp;quot;v-mode&amp;quot;&amp;gt;视频通话&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- &amp;lt;div&amp;gt; &amp;lt;img onclick=&amp;quot;changeMode&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515364706/audio000.png&amp;quot; &amp;gt; &amp;lt;p&amp;gt;语音通话&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; --&amp;gt; &amp;lt;div&amp;gt; &amp;lt;img onclick=&amp;quot;dropCall()&amp;quot; src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661433175110/reject.png&amp;quot; &amp;gt; &amp;lt;p style=&amp;quot;color: #E24940&amp;quot;&amp;gt;挂断&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;audio id=&amp;quot;ring-music&amp;quot; loop&amp;gt; &amp;lt;source src=&amp;quot;https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-9/1662024495462/ring_new.mp3&amp;quot; type=&amp;quot;audio/mpeg&amp;quot;&amp;gt; &amp;lt;/audio&amp;gt; &amp;lt;div class=&amp;quot;alert alert-warning fade in&amp;quot; id=&amp;quot;message-alert&amp;quot;&amp;gt; &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;close&amp;quot; data-dismiss=&amp;quot;alert&amp;quot;&amp;gt; &amp;amp;times; &amp;lt;/a&amp;gt; &amp;lt;span class=&amp;quot;call-message&amp;quot;&amp;gt;呼叫超时,请稍后再试&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script&amp;gt; const duerRtcSdk = window.DUER_rtcsdk; const enbaleRtcDebugLog = true; let duerRtc = null; let customer = null; let callInfo = { mute: false, mode: duerRtcSdk.CallMode.AUDIO_VIDEO }; $(changeView()); $('#login-form').bootstrapValidator({ message: '请填写完整的信息', feedbackIcons: { valid: 'glyphicon glyphicon-ok', invalid: 'glyphicon glyphicon-remove', validating: 'glyphicon glyphicon-refresh' }, fields: { appId: { validators: { notEmpty: { message: 'appId不能为空!' } } }, uid: { validators: { notEmpty: { message: 'uid不能为空!' } } }, token: { validators: { notEmpty: { message: 'token不能为空!' } } }, appName: { validators: { notEmpty: { message: 'appName不能为空!' } } } } }); $('#device-form').bootstrapValidator({ message: '请填写完整的信息', feedbackIcons: { valid: 'glyphicon glyphicon-ok', invalid: 'glyphicon glyphicon-remove', validating: 'glyphicon glyphicon-refresh' }, fields: { appId: { validators: { notEmpty: { message: 'appId不能为空!' } } }, uid: { validators: { notEmpty: { message: 'uid不能为空!' } } }, name: { validators: { notEmpty: { message: '被叫方姓名不能为空!' } } }, callMode: { validators: { notEmpty: { message: '呼叫方式不能为空!' } } } } }); function checkLoginForm() { $('#login-form').bootstrapValidator('validate'); const validRes = $('#login-form').data('bootstrapValidator'); if (validRes.isValid()) { const formData = $('#login-form').serializeArray(); const loginParams = {}; for(const i in formData) { loginParams[formData[i]['name']] = formData[i]['value']; } callInfo.loginParams = loginParams; rtcListener(loginParams); } } // 离席入席操作,入席web可以立即收到来电,离席web将不会收到任何来电 // $('#customer-select').change(_ =&amp;gt; { // const status = $('#customer-select').val(); // if (status == 1) { // customer.join(); // } else if (status == 0) { // customer.leave(); // } // }); function checkCallForm() { $('#device-form').bootstrapValidator('validate'); const validRes = $('#device-form').data('bootstrapValidator'); if (validRes.isValid()) { const formData = $('#device-form').serializeArray(); const serialData = {}; for(const i in formData) { serialData[formData[i]['name']] = formData[i]['value']; } Object.assign(callInfo, serialData); let {appId, uid, callMode} = serialData; makeCall(appId, uid, +callMode); } } // 设置事件回调监听器 function rtcListener(loginParams) { duerRtc = new duerRtcSdk.RtcContext({ onAuthStatusChanged: auth =&amp;gt; { if (auth.success) { console.log('auth.success'); // 自动或手动入席离席只能二选一,不能混用!!! // 开启自动入席离席 duerRtc.enableCustomer(true); // 开启手动入席离席 // customer = duerRtc.enableCustomer(false); // customer.join(); // this.setState({ isLogin: true }) } else { switch (auth.code) { case duerRtcSdk.AuthCode.PARAM_ERROR: case duerRtcSdk.AuthCode.APPID_INVALID: { // 联调阶段可能遇到的错误 break } case duerRtcSdk.AuthCode.TOKEN_INVALID: case duerRtcSdk.AuthCode.TOKEN_EXPIRED: { // 重新刷新token break } case duerRtcSdk.AuthCode.NO_ERROR: case duerRtcSdk.AuthCode.OTHER_DEVICE_LOGIN: { break } } } } }, enbaleRtcDebugLog); duerRtc.setCallListener({ onIncomingCall: intent =&amp;gt; { const serviceInfo = intent.serviceInfo &amp;amp;&amp;amp; JSON.parse(intent.serviceInfo) || {}; intent.serviceInfo = serviceInfo; Object.assign(callInfo, intent); incomingViewShow(); console.log(&amp;quot;onIncomingCall&amp;quot;, intent); }, onAddConfereeStateChanged: state =&amp;gt; { console.log(&amp;quot;onAddConfereeStateChanged&amp;quot;, state); }, onCallReplaced: replaced =&amp;gt; { console.log(&amp;quot;onCallReplaced&amp;quot;, replaced); }, onCallStateChanged: stateInfo =&amp;gt; { if (stateInfo.state === duerRtcSdk.CallState.RINGBACK) { // 被叫开始响铃 ringViewShow(); } else if (stateInfo.state === duerRtcSdk.CallState.DISCONNECTED) { // 通话已经断开 freeCallView(); if (stateInfo.reason === duerRtcSdk.CallReason.TIMEOUT) { // 呼叫超时 callTimeout(); } } else if (stateInfo.state === duerRtcSdk.CallState.CONNECTED) { // 通话被正常接听 callViewShow(); } console.log(&amp;quot;onCallStateChanged&amp;quot;, stateInfo); }, onConfereeLayout: layouts =&amp;gt; { setLayouts(layouts); console.log(&amp;quot;onConfereeLayout&amp;quot;, layouts); }, onRecordStateChanged: recordStateInfo =&amp;gt; { console.log(&amp;quot;onRecordStateChanged&amp;quot;, recordStateInfo); } }); duerRtc.setConnectListener({ onConnectionChanged: conn =&amp;gt; { if (conn === 2) { // 长链接已建立 $('#login-form').hide(); $('#device-form').show(); } if (conn === 3) { // 长链接已断开 duerRtc = null; } console.log(&amp;quot;onConnectionChanged&amp;quot;, conn); } }); duerRtc.setMediaDeviceListener({ // 麦克风/摄像头状态 onMediaDeviceStateChanged: (device, state, error) =&amp;gt; { console.log('onMediaDeviceStateChanged', device, state, error); } }); rtcConnect(loginParams); } // 建立长连接 function rtcConnect(loginParams) { let {uid, appId} = loginParams; const uri = new duerRtcSdk.CallUri(uid, appId); loginParams.uri = uri; duerRtc.login(loginParams); } // 呼叫 function makeCall(appId, uid, callMode, callerRole = duerRtcSdk.CallerRole.CALL_CENTER) { const calleeUri = new duerRtcSdk.CallUri(uid, appId); let intent = duerRtcSdk.MakeCallIntent(calleeUri, duerRtcSdk.CallMode.AUDIO_VIDEO); callMode &amp;amp;&amp;amp; (intent.callMode = callMode); callerRole &amp;amp;&amp;amp; (intent.callerRole = callerRole); callInfo.callMode = callMode; const result = duerRtc.makeCall(intent) console.info('makeCall action', intent, result) if (duerRtcSdk.CallReason.NORMAL == result) { // 呼出成功 } else if (duerRtcSdk.CallReason.ALREADY_IN_CALL == result || CallReason.EXCEPTION_INPUT_ILLEGAL == result) { console.error('makeCall resaon', duerRtcSdk.CallReasonMap.get(result)) } else { // 其他原因,目前不会出现 console.warn('makeCall res', result) } } // 来电接听 function answerCall(mode) { duerRtc.answerCall(callInfo.index, mode, false); callInfo.callMode = mode; } // 拒接来电 function rejectCall() { duerRtc.rejectIncomingCall(callInfo.index, 'REJECT_CALL_USER_REASON'); } // 改变通话模式 type 1去电 2通话中 function changeMode() { const mode = callInfo.callMode == duerRtcSdk.CallMode.AUDIO_VIDEO ? duerRtcSdk.CallMode.AUDIO_ONLY : duerRtcSdk.CallMode.AUDIO_VIDEO; console.log(mode, callInfo.callMode); if (mode == duerRtcSdk.CallMode.AUDIO_VIDEO) { $('.out-call-mode img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515364706/audio000.png'); $('.out-call-mode-txt').text('语音通话'); $('.mode-change-btn img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515364706/audio000.png'); $('.v-mode').text('语音通话'); $('.audio-tip-wrap').hide(); } else if (mode == duerRtcSdk.CallMode.AUDIO_ONLY) { $('.out-call-mode img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661828922567/videoCall0.png'); $('.out-call-mode-txt').text('视频通话'); $('.mode-change-btn img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661828922567/videoCall0.png'); $('.v-mode').text('视频通话'); $('.audio-tip-wrap').show(); } duerRtc.changeCallMode(mode); callInfo.callMode = mode; } // 静音状态切换 function changeMute() { if (callInfo.mute) { $('.mute-change-btn img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515279806/quite0.png'); $('.a-mute').text('静音'); } else { $('.mute-change-btn img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515279209/quite.png'); $('.a-mute').text('已静音'); } callInfo.mute = !callInfo.mute; duerRtc.muteAudio(callInfo.mute); } // 挂断通话 function dropCall() { duerRtc.dropCall('DROP_CALL_USER_REASON'); } // 设置音视频 function setLayouts(layouts) { if (!layouts) { return; } // const audioLocal = $('#audio-local').get(0); // const videoLocal = $('#video-local').get(0); // const audioPeer = $('#audio-peer').get(0); // const videoPeer = $('#video-peer').get(0); const audioLocal = document.getElementById('audio-local'); const videoLocal = document.getElementById('video-local'); const audioPeer = document.getElementById('audio-peer'); const videoPeer = document.getElementById('video-peer'); const [layoutLocal, layoutPeer] = layouts; if (layoutLocal.videoTrack) { $('#video-local').show(); $('.local-view .audio-tip-wrap').hide(); const stream = new MediaStream; stream.addTrack(layoutLocal.videoTrack); videoLocal.srcObject = stream; } else { $('#video-local').hide(); $('.local-view .audio-tip-wrap').show(); } if (layoutLocal.audioTrack &amp;amp;&amp;amp; !layoutLocal.isLocal) { const stream = new MediaStream; stream.addTrack(layoutLocal.audioTrack); audioLocal.srcObject = stream; } if (layoutPeer.videoTrack) { $('#video-peer').show(); $('.peer-view .audio-tip-wrap').hide(); const stream = new MediaStream; stream.addTrack(layoutPeer.videoTrack); videoPeer.srcObject = stream; } else { $('#video-peer').hide(); $('.peer-view .audio-tip-wrap').show(); } if (layoutPeer.audioTrack) { const stream = new MediaStream; stream.addTrack(layoutPeer.audioTrack); audioPeer.srcObject = stream; } } // 视频大小窗口切换事件 function changeView() { $('.peer-view').click(_ =&amp;gt; { const cList = $('.peer-view').attr('class'); if (~cList.indexOf('sub-view')) { $('.peer-view').attr('class', 'peer-view main-view'); $('.local-view').attr('class', 'local-view sub-view'); } }); $('.local-view').click(_ =&amp;gt; { const cList = $('.local-view').attr('class'); if (~cList.indexOf('sub-view')) { $('.local-view').attr('class', 'local-view main-view'); $('.peer-view').attr('class', 'peer-view sub-view'); } }); } // 去电响铃时界面展示 function ringViewShow() { $('#ring-music').get(0).play(); $('.peer-name').text(callInfo.name); if (callInfo.callMode == duerRtcSdk.CallMode.AUDIO_VIDEO) { // 当前为视频通话 $('.out-call-mode img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515364706/audio000.png'); $('.out-call-mode-txt').text('语音通话'); } else if (callInfo.callMode == duerRtcSdk.CallMode.AUDIO_ONLY) { // 当前为音频通话 $('.out-call-mode img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661828922567/videoCall0.png'); $('.out-call-mode-txt').text('视频通话'); } $('#outing-call-view').show(); } // 收到来电 function incomingViewShow() { $('#incoming-call-dialog').modal('show'); $('#ring-music').get(0).play(); } // 空闲状态 function freeCallView() { $('#outing-call-view').hide(); $('#call-view').hide(); $('#incoming-call-dialog').modal('hide'); $('#ring-music').get(0).pause(); Object.assign(callInfo, { mute: false }); } // 通话正常接听 function callViewShow() { $('#ring-music').get(0).pause(); $('#incoming-call-dialog').modal('hide'); $('#outing-call-view').hide(); if (callInfo.mute) { // 已静音 $('.mute-change-btn img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515279209/quite.png'); $('.a-mute').text('已静音'); } else { $('.mute-change-btn img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515279806/quite0.png'); $('.a-mute').text('静音'); } if (callInfo.callMode == duerRtcSdk.CallMode.AUDIO_VIDEO) { // 当前为视频通话 $('.mode-change-btn img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661515364706/audio000.png'); $('.v-mode').text('语音通话'); $('.audio-tip-wrap').hide(); } else if (callInfo.callMode == duerRtcSdk.CallMode.AUDIO_ONLY) { // 当前为音频通话 $('.mode-change-btn img').attr('src', 'https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661828922567/videoCall0.png'); $('.v-mode').text('视频通话'); $('.audio-tip-wrap').show(); } $('#call-view').show(); } // 呼叫超时 function callTimeout() { $('#outing-call-view').hide(); $('#message-alert').show(); } // 获取浏览器权限,根据实际情况调用,只限于用户没有做过授权 function getDevice() { navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; if (navigator.getUserMedia) { navigator.getUserMedia({video: true}, function onSuccess(stream) { console.log('摄像头开启成功'); }, function onError(error) { alert(&amp;quot;摄像头错误:&amp;quot;, error); }); navigator.getUserMedia({audio:true}, function onSuccess(stream) { console.log('麦克风开启成功'); }, function onError(error) { alert(&amp;quot;麦克风错误:&amp;quot;, error); }); } else { alert('暂不支持'); } } // 定时获取摄像头麦克风权限,根据业务实际情况调用 // 用于定位音视频是否因为权限问题不显示 // setInterval(_ =&amp;gt; { // getDevice(); // }, 10000); &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; body { background-color: #141e30; } #login-form, #device-form { width: 500px; margin: 20px auto 20px; } .usr-info { text-align: center; } .usr-pho { margin-top: 35px; width: 120px; height: 120px; } .usr-name { margin-top: 10px; font-weight: 500; font-size: 30px; line-height: 42px; color: #1A1A1A; } .incoming-call-tip { font-size: 16px; line-height: 22px; color: #666666; } .op-btns { display: flex; flex-direction: row; align-items: center; justify-content: center; } .op-btns img { width: 80px; height: 80px; margin: 16px 40px; cursor: pointer; } .op-txt { line-height: 20px; text-align: center; } #outing-call-view, #call-view { position: fixed; width: 100%; height: 100%; left: 0; top: 0; z-index: 10052; background: #3c3667; color: #fff; display: flex; flex-direction: column; align-items: center; text-align: center; } #outing-call-view .op-btns { margin-top: 50px; } .peer-pho { width: 104px; height: 104px; margin-top: 50px; } .peer-name { font-size: 60px; line-height: 86px; } .outing-call-tip { font-size: 42px; line-height: 60px; color: rgba(225, 225, 225, .5); } #call-view .op-btns { position: absolute; bottom: 50px; } .main-view { width: 100%; height: 100%; display: flex; justify-content: center; background-image: url('https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661773897681/audioBg.png'); background-repeat: no-repeat; background-size: 100% 100%; color: #fff; text-align: center; } .main-view video { width: 100%; object-fit: fill; } .main-view .audio-name { margin-top: 100px; font-size: 62px; line-height: 87px; } .main-view .audio-call { font-size: 36px; line-height: 50px; color: rgba(225, 225, 225, .5); margin-top: 17px; } .main-view .audio-tip-wrap { position: absolute; top: 0; } .sub-view { width: 320px; height: 192px; position: absolute; left: 48px; top: 48px; background-image: url('https://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-8/1661773897681/audioBg.png'); background-repeat: no-repeat; background-size: 100%; color: #fff; z-index: 1; } .sub-view video { width: 320px; height: 192px; object-fit: fill; } .sub-view .audio-tip-wrap { position: absolute; bottom: 10px; right: 10px; } .sub-view .audio-name { font-size: 48px; line-height: 67px; max-width: 300px; } .sub-view .audio-call { font-size: 24px; line-height: 34px; text-align: right; } #message-alert { position: fixed; z-index: 1053; width: 300px; right: 0; top: 10px; display: none; } .desc-title { text-align: center; margin-bottom: 20px; } &amp;lt;/style&amp;gt; &amp;lt;/html&amp;gt;</code></pre>

页面列表

ITEM_HTML