首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用函数的WebRTC流[Android]

调用函数的WebRTC流[Android]
EN

Stack Overflow用户
提问于 2014-07-04 13:23:04
回答 1查看 4K关注 0票数 2

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

我想要的是:

  1. 构建我自己的WebRTC应用程序,它将在Android设备上进行AV调用。
  2. 替换现有的https://apprtc.appspot.com/服务器和相关功能。

为了存档以上各点,我想了解WebRTC函数调用的基本流程和进行/接收调用的步骤(我需要调用的函数和流程)。

我已经看过源代码,了解了很少的东西,但是作为代码理解起来相当复杂,而且没有任何文档。

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

我见过这些帖子,很有帮助:

  1. WebRTC java server trouble
  2. https://www.webrtc-experiment.com/docs/WebRTC-PeerConnection.html

我能够构建和运行AppRTCDemo应用程序。

在这方面的任何帮助都将是很大的帮助!

EN

回答 1

Stack Overflow用户

发布于 2014-07-07 01:18:09

没有时间表,它是异步的,但我会尝试解释,但有两个主要的流程,提供和回答的流程与SDP和冰淇淋流。

流程1: SDP

第一步-提供同侪:

在提供端,创建一个RTCPeerconnection (使用stun、trun服务器作为参数)。

代码语言:javascript
复制
    var STUN = {
        url:'stun:stun.l.google.com:19302'
    };

    var TURN = {
        url: 'turn:homeo@turn.bistri.com:80',
        credential: 'homeo'
    };

    var iceServers = {
        iceServers: [STUN, TURN]
    };

    var peer = new RTCPeerConnection(iceServers);

第二步-提供同侪:

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

代码语言:javascript
复制
    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);
    }

第三步-提供同侪:

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

代码语言:javascript
复制
    function onSdpSuccess(sdp) {
        console.log(sdp);
        peer.setLocalDescription(sdp);
        //I use socket.io for my signaling server
        socket.emit('offer',sdp);
    }

第五步-回答同伴:

答案对等者,每次收到报价时,都会创建一个带有RTCPeerConnection的转身、眩晕服务器,然后是getUserMedia,然后在回调中将流添加到RTCPeerconnection。在提供SDP时,使用setRemoteDescription和sdpOffer。然后触发createAnswer。在createAnswer的成功回调中,使用带有参数的setLocalDescription,然后使用信令服务器将应答sdp发送给提供对等方。

代码语言:javascript
复制
    //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答案,setRemoteDescription on RTCPeerConnection。

代码语言:javascript
复制
    socket.on('answer', function (sdp) {
      peer.setRemoteDescription(new RTCSessionDescription(sdp), function(){console.log("Remote Description Success")}, function(){console.log("Remote Description Error")});
    }); 

流程2: ICECandidate

双方:

每次RTCPeerConnection触发onicecandidate时,通过信号服务器将候选发送到另一个对等点。当收到来自信令服务器的icecandidate时,只需使用RTCPeerConnection (新RTCIceCandidate(obj))将其添加到

代码语言:javascript
复制
    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
      }));
    }); 

最后:

如果上面的两个流运行良好,那么可以在每个RTCPeerConnection上使用onaddstream事件。当ICE候选人将配对并找到最佳的对等方式时,他们将添加与SDP相关联的流,这将通过对等连接。因此,在这种情况下,您只需要添加您的流,然后添加到一个视频标签,例如,它是好的。

代码语言:javascript
复制
    peer.onaddstream = function (event) {
      vid.src = webkitURL.createObjectURL(event.stream);
      console.log("New Stream");
      console.log(event.stream);
    };

我将在明天编辑一些代码,我认为,以帮助理解我在说什么。如果有问题就去问吧。

这是我的信令服务器:

代码语言:javascript
复制
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);
  });

});

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24575368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档