<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 概述 天氣燥熱,出門不易。遂研究一下owt-server,從owt-client-javascript的流程開始吧。 ## 獲取一個會議室 owt-client-javascript的時候有一個初始化房間的過程 ``` ///owt-client-javascript/src/samples/conference/samplertcservice.js (function initSampleRoom () { icsREST.API.getRooms(pageOption, function(rooms){ ... // 獲取房間信息,如果有房間,直接跳出,如果沒有房間則創建一個房間 if (sampleRoom !== undefined) { break; } } // 創建房間的方法 var tryCreate = function(room, callback) {...} if (!sampleRoom) { room = { name: 'sampleRoom' }; //創建房間 tryCreate(room, function(Id) { sampleRoom = Id; console.log('sampleRoom Id:', sampleRoom); }); } }) ``` ## 獲取token 從owt-client-javascript的rest-sample.js開始發送獲取token請求。 ``` ///owt-client-javascript/src/samples/conference/public/scripts/rest-sample.js var createToken = function (room, user, role, callback, host) { ... send('POST', '/tokens/', body, callback, host); }; ``` 請求到本地服務 ``` ///owt-client-javascript/src/samples/conference/samplertcservice.js app.post('/tokens', function(req, res) { ... icsREST.API.createToken(room, user, role, preference, ...}); } ``` 本地服務開始請求到owt-server的接口創建token,并且返回token ``` ///owt-server/source/management_api/resource/v1/index.js router.post('/rooms/:room/tokens', tokensResource.create); ``` ## 加入會議并且獲取房間中的流 加入會議: ``` ///owt-client-javascript/src/samples/conference/public/scripts/index.js conference.join(token).then(resp => {} ``` 通過返回的token解析出host, 連接上房間,并且把房間中的流信息加入到map里 ``` ///owt-client-javascript/src/samples/conference/public/scripts/index.js signaling.connect(host, isSecured, loginInfo).then((resp) => { //修改連接狀態 signalingState = SignalingState.CONNECTED; room = resp.room; if (room.streams !== undefined) { for (const st of room.streams) { //判斷流的狀態 if (st.type === 'mixed') { st.viewport = st.info.label; } //把房間的流信息加入到列表里 remoteStreams.set(st.id, createRemoteStream(st)); } } ... } ``` 設置好房間的流后,開始獲取本地流并且開始推流。 ``` ///owt-client-javascript/src/samples/conference/public/scripts/index.js ... let mediaStream; Owt.Base.MediaStreamFactory.createMediaStream(new Owt.Base.StreamConstraints( audioConstraints, videoConstraints)).then(stream => { let publishOption; if (simulcast) { publishOption = {video:[ {rid: 'q', active: true/*, scaleResolutionDownBy: 4.0*/}, {rid: 'h', active: true/*, scaleResolutionDownBy: 2.0*/}, {rid: 'f', active: true} ]}; } // 獲取本地流 mediaStream = stream; localStream = new Owt.Base.LocalStream( mediaStream, new Owt.Base.StreamSourceInfo( 'mic', 'camera')); $('.local video').get(0).srcObject = stream; // 推流 conference.publish(localStream, publishOption).then(publication => { publicationGlobal = publication; mixStream(myRoom, publication.id, 'common') publication.addEventListener('error', (err) => { console.log('Publication error: ' + err.error.message); }); }); }, err => { console.error('Failed to create MediaStream, ' + err); }); ``` ## 拉流 開始拉流 ``` ///owt-client-javascript/src/samples/conference/public/scripts/index.js for (const stream of streams) { if(!subscribeForward){ if (stream.source.audio === 'mixed' || stream.source.video === 'mixed') { //開始拉流 subscribeAndRenderVideo(stream); } } else if (stream.source.audio !== 'mixed') { //開始拉流 subscribeAndRenderVideo(stream); } } ``` 拉流所在的函數 ``` function subscribeAndRenderVideo(stream){ let subscirptionLocal=null; function subscribeDifferentResolution(stream, resolution){ subscirptionLocal && subscirptionLocal.stop(); subscirptionLocal = null; const videoOptions = {}; videoOptions.resolution = resolution; conference.subscribe(stream, { audio: true, video: videoOptions }).then(( subscription) => { subscirptionLocal = subscription; $(`#${stream.id}`).get(0).srcObject = stream.mediaStream; }); } // 創建不同分辨率的按鈕和拉對應分辨率的流 let $p = createResolutionButtons(stream, subscribeDifferentResolution); //拉默認流 conference.subscribe(stream) .then((subscription)=>{ subscirptionLocal = subscription; let $video = $(`<video controls autoplay id=${stream.id} style="display:block" >this browser does not supported video tag</video>`); $video.get(0).srcObject = stream.mediaStream; $p.append($video); }, (err)=>{ console.log('subscribe failed', err); }); //流結束的事件 stream.addEventListener('ended', () => { removeUi(stream.id); $(`#${stream.id}resolutions`).remove(); }); // 更新流的事件 stream.addEventListener('updated', () => { // Update resolution buttons $p.children('button').remove(); createResolutionButtons(stream, subscribeDifferentResolution); }); } ``` 開始webrtc的交互流程createPeerConnection ,CreateOffer,setLocalDescription ``` ///owt-client-javascript/src/sdk/conference/client.js this._createPeerConnection(); const offerOptions = {}; if (typeof this._pc.addTransceiver === 'function') { // |direction| seems not working on Safari. if (mediaOptions.audio) { this._pc.addTransceiver('audio', {direction: 'recvonly'}); } if (mediaOptions.video) { this._pc.addTransceiver('video', {direction: 'recvonly'}); } } else { offerOptions.offerToReceiveAudio = !!options.audio; offerOptions.offerToReceiveVideo = !!options.video; } this._pc.createOffer(offerOptions).then((desc) => { if (options) { desc.sdp = this._setRtpReceiverOptions(desc.sdp, options); } this._pc.setLocalDescription(desc).then(() => { this._signaling.sendSignalingMessage('soac', { id: this ._internalId, signaling: desc, }); }, function(errorMessage) { Logger.error('Set local description failed. Message: ' + JSON.stringify(errorMessage)); }); }, function(error) { Logger.error('Create offer failed. Error info: ' + JSON.stringify( error)); }).catch((e)=>{ Logger.error('Failed to create offer or set SDP. Message: ' + e.message); this._unsubscribe(); this._rejectPromise(e); this._fireEndedEventOnPublicationOrSubscription(); }); } ``` 設置setRemoteDescription,_createAndSendAnswer ``` ////owt-client-javascript/src/sdk/conference/client.js // 信令回調 signaling.addEventListener('data', (event) => { onSignalingMessage(event.message.notification, event.message.data); }); // _onOffer(sdp) { Logger.debug('About to set remote description. Signaling state: ' + this._pc.signalingState); sdp.sdp = this._setRtpSenderOptions(sdp.sdp, this._config); // Firefox only has one codec in answer, which does not truly reflect its // decoding capability. So we set codec preference to remote offer, and let // Firefox choose its preferred codec. // Reference: https://bugzilla.mozilla.org/show_bug.cgi?id=814227. if (Utils.isFirefox()) { sdp.sdp = this._setCodecOrder(sdp.sdp); } const sessionDescription = new RTCSessionDescription(sdp); this._pc.setRemoteDescription(sessionDescription).then(() => { this._createAndSendAnswer(); }, (error) => { Logger.debug('Set remote description failed. Message: ' + error.message); this._stop(error, true); }); } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看