zoukankan      html  css  js  c++  java
  • 【webrtc】webrtc通过peerconnection进行音视频互通(25)

    文档gitbook地址

    文档github地址

    js部分:包括媒体协商整个流程等
    'user strict'
    
    var localvideo = document.querySelector('video#localvideo');
    var remoteVideo = document.querySelector('video#remotevideo');
    
    var btnStart = document.querySelector('button#start');
    var btnCall = document.querySelector('button#call');
    var btnHangup = document.querySelector('button#hangup');
    
    btnStart.onclick = start;
    btnCall.onclick = call;
    btnHangup.onclick = hangup;
    
    var localStream;
    var pc1,pc2;
    function getMediaStream (stream){
        localvideo.srcObject = stream;
        localStream = stream;
    }
    function handleError(err){
        console.err('Failed to get stream')
    }
    
    function start(){
        if(!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia){
            console.error('the getUserMedia is not support!')
            return;
        }else{
            var constraints = {
                video:true,
                audio:false
            }
            navigator.mediaDevices.getUserMedia(constraints).then(getMediaStream).catch(handleError)
        }
    }
    
    function getRemoteStream(e){
        remoteVideo.srcObject = e.streams[0];
    }
    
    function handleOfferError(err){
        console.error('Failed to create offer',err)
    }
    
    function handleAnswerError(err){
        console.log("Failed to create answer",err)
    }
    
    function getOffer(desc){
        pc1.setLocalDescription(desc);
        //send desc to signal
        //receive desc from signal
        pc2.setRemoteDescription(desc);
    
        pc2.createAnswer()
            .then(getAnswer)
            .catch(handleAnswerError);
    }
    
    function getAnswer(desc){
        pc2.setLocalDescription(desc);
        //send desc to signal和pc1进行交换
        //pc1 receive desc from signal
    
        pc1.setRemoteDescription(desc);
    }
    
    function call(){
        pc1 = new RTCPeerConnection();
        pc2 = new RTCPeerConnection();
    
        pc1.onicecandidate = (e) => {
            pc2.addIceCandidate(e.candidate)
        }
    
        pc2.onicecandidate = (e) => {
            pc1.addIceCandidate(e.candidate)
        }
    
        pc2.ontrack = getRemoteStream;
    
        localStream.getTracks().forEach((track) => {//localStream.getTracks()拿到音视频轨道;将本地采集的音视频流添加到peerconnection
            pc1.addTrack(track,localStream);
        });
    
        var offerOPtions = {
            offerToReceiveAudio:0,
            offerToReceiveVideo:1 
        }
        pc1.createOffer(offerOPtions)
            .then(getOffer)
            .catch(handleOfferError);
    }
    
    function hangup(){
        pc1.close();
    
        pc2.close();
    
        pc1 = null;
        pc2 = null;
    }
    
    
    
    html部分
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>webrtc PeerConnection</title>
    </head>
    <body>
        <div>
            <video id = 'localvideo' autoplay playsinline></video>
            <video id = 'remotevideo' autoplay playsinline></video>
            <div>
                <button id = "start">start</button>
                <button id = "call">Call</button>
                <button id = "hangup">Hang Up</button>
            </div>
        </div>
        <script src="./lib/adapter-latest.js"></script>
        <script src="./js/main.js"></script>
    </body>
    </html>
    

    github地址,webserver/peerconnection文件夹下面,直接node server.js之后打开chrome浏览器输入https://localhost:9999,进入webserver下面的peerconnection文件中,打开index.html。注意cert下面的两个证书需要把自己的证书放到webserver/cert文件目录下面,如果没有的话也可以尝试改写https的为http的。

  • 相关阅读:
    koa2环境搭建
    单例模式
    nodejs fs path
    path node
    webpack code splitting
    babel 插件编写
    C#验证码类
    C#身份证识别相关技术
    C# Socket服务端与客户端通信(包含大文件的断点传输)
    动态抓取网页信息
  • 原文地址:https://www.cnblogs.com/smileyqp/p/12675251.html
Copyright © 2011-2022 走看看