用于进行调用的WebRTC函数调用流[Android]

用于进行调用的WebRTC函数调用流[Android],android,webrtc,apprtcdemo,Android,Webrtc,Apprtcdemo,我指的是ApprtDemo的源代码,它是WebRTC的一个演示应用程序 我尝试的是: 构建我自己的WebRTC应用程序,在Android设备上进行AV调用 替换现有的https://apprtc.appspot.com/服务器和相关功能 对于以上几点的存档,我想了解WebRTC函数调用的基本流程和发出/接收调用的步骤(我需要调用的函数和流程) 我浏览了源代码,了解了一些东西, 但由于代码理解起来相当复杂,而且没有任何文档 如果有人提供任何示例或文档来解释进行/接收AV呼叫的步骤(如何获取/设置S

我指的是ApprtDemo的源代码,它是WebRTC的一个演示应用程序

我尝试的是:

  • 构建我自己的WebRTC应用程序,在Android设备上进行AV调用
  • 替换现有的
    https://apprtc.appspot.com/
    服务器和相关功能 对于以上几点的存档,我想了解WebRTC函数调用的基本流程和发出/接收调用的步骤(我需要调用的函数和流程)

    我浏览了源代码,了解了一些东西, 但由于代码理解起来相当复杂,而且没有任何文档

    如果有人提供任何示例或文档来解释进行/接收AV呼叫的步骤(如何获取/设置SDP,如何呈现本地/远程视频等),这将非常有帮助

    我看过这些帖子,非常有帮助:

  • 我能够构建并运行AppRTCDemo应用程序


    这方面的任何帮助都将是巨大的帮助

    没有时间表,它是异步的,但我将尝试解释,但有两个主要流程,SDP提供和回答流程和ICE候选流程

    流程1:SDP

    步骤1-提供对等服务:

    在提供端,创建一个RTPeerConnection(以stun、trun服务器作为参数)

    第2步-提供对等服务:

    使用您的约束调用getUserMedia。在成功回调中,使用addStream方法将流添加到RTPeerConnection。然后,您可以通过调用Peerconnection对象上的createOffer来创建要约

        navigator.webkitGetUserMedia(
        {
          audio: false,
          video: {
            mandatory: {
              maxWidth: screen.width,
              maxHeight: screen.height,
              minFrameRate: 1,
              maxFrameRate: 25
            }
          }
        },
        gotStream, function(e){console.log("getUserMedia error: ", e);});
    
        function gotStream(stream){
          //If you want too see your own camera
          vid.src = webkitURL.createObjectURL(stream);
    
          peer.addStream(stream);
    
          peer.createOffer(onSdpSuccess, onSdpError);
        }
    
    第3步-提供对等服务:

    在createOffer的回调方法中,将参数(sdp offer)设置为RTPeerConnection(将开始收集ICE候选对象)的localDescription。然后使用信令服务器将报价发送给另一个对等方。(我不会描述信令服务器,它只是将数据从一个服务器传递给另一个服务器)

    第5步-回答同伴:

    应答对等方每次收到要约时,都会与TURN、STUN服务器、getUserMedia创建一个RTPeerConnection,然后在回调中,将流添加到RTPeerConnection。对于SDP选项,请将setRemoteDescription与sdpOffer一起使用。然后触发createAnswer。 在createAnswer的成功回调中,使用参数setLocalDescription,然后使用信令服务器将应答sdp发送给要约对等方

        //Receive by a socket.io socket
        //The callbacks are useless unless for tracking
        socket.on('offer', function (sdp) {
            peer.setRemoteDescription(new RTCSessionDescription(sdp), onSdpSuccess, onSdpError);
    
            peer.createAnswer(function (sdp) {
                peer.setLocalDescription(sdp);
                socket.emit('answer',sdp);
            }, onSdpError);
    
        }); 
    
    第7步:提供对等服务

    接收sdp应答,在RTPeerConnection上设置RemoteDescription

        socket.on('answer', function (sdp) {
          peer.setRemoteDescription(new RTCSessionDescription(sdp), function(){console.log("Remote Description Success")}, function(){console.log("Remote Description Error")});
        }); 
    
    流程2:ICE候选者

    双方:

    每次RTPeerConnection触发onicecandidate时,通过signalingserver将候选对象发送给另一个对等方。 当接收到来自信令服务器的ICEScandidate时,只需使用addIceCandidate(新的RTICEScandidate(obj))将其添加到RTPeerConnection

    最后:

    如果上述两个流工作正常,请在每个RTPeerConnection上使用onaddstream事件。当ICE候选者将彼此配对并找到点对点的最佳方式时,他们将添加与SDP协商的流,该流将通过点对点连接。因此,在这种情况下,你只需要添加你的流,然后到一个视频标签,例如,它是好的

        peer.onaddstream = function (event) {
          vid.src = webkitURL.createObjectURL(event.stream);
          console.log("New Stream");
          console.log(event.stream);
        };
    
    我将用一些我认为有助于理解我所说内容的代码编辑tommorow。如果你有问题,就去问吧

    这是我的信令服务器:

    var app = require('express')();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    
    server.listen(3000);
    
    app.get('/', function (req, res) {
      res.send('The cake is a lie');
    });
    
    io.on('connection', function (socket) {
    
      console.log('NEW CONNECTION');
    
      socket.on('offer', function (data) {
        console.log(data);
        socket.broadcast.emit("offer",data);
      });
    
      socket.on('answer', function (data) {
        console.log(data);
        socket.broadcast.emit("answer",data);
      });
    
      socket.on('candidate', function (data) {
        console.log(data);
        socket.broadcast.emit("candidate",data);
      });
    

    }))

    感谢您的流,但是这是JavaScript API流还是Android API流,还是通用流?我正在寻找android版本。如果你能提供示例代码,这将非常有帮助。我编辑过,它不容易理解,但webRTC不容易理解。我刚刚意识到它不是你想要的,你不是在寻找JS API,我不知道Android API是否不同。谢谢
    @jujukeder
    ,JS流很有帮助,Android API中的
    getUserMedia
    等价物是什么?您可以在下面的应用程序代码中找到已经编译的libjingle\u peerconnection库。getUserMedia是该库的一部分。此外,流与webrtc专家定义的流几乎相同,应该用于执行webrtc调用。
        peer.onicecandidate = function (event) {
          console.log("New Candidate");
          console.log(event.candidate);
    
          socket.emit('candidate',event.candidate);
        };
    
        socket.on('candidate', function (candidate) {
          console.log("New Remote Candidate");
          console.log(candidate);
    
          peer.addIceCandidate(new RTCIceCandidate({
              sdpMLineIndex: candidate.sdpMLineIndex,
              candidate: candidate.candidate
          }));
        }); 
    
        peer.onaddstream = function (event) {
          vid.src = webkitURL.createObjectURL(event.stream);
          console.log("New Stream");
          console.log(event.stream);
        };
    
    var app = require('express')();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    
    server.listen(3000);
    
    app.get('/', function (req, res) {
      res.send('The cake is a lie');
    });
    
    io.on('connection', function (socket) {
    
      console.log('NEW CONNECTION');
    
      socket.on('offer', function (data) {
        console.log(data);
        socket.broadcast.emit("offer",data);
      });
    
      socket.on('answer', function (data) {
        console.log(data);
        socket.broadcast.emit("answer",data);
      });
    
      socket.on('candidate', function (data) {
        console.log(data);
        socket.broadcast.emit("candidate",data);
      });