WebRTC视频Android客户端的见解

进入公司之后做了第一个项目就是关于视频的,因为用的是别人提供的sdk,所以说很容易就能实现其中的功能,那么项目结尾的时候就想着不能光会用啊,咱好赖算是个小工程师,起码得知道原理过程吧!那么下面就讲解一下本人对关于WebRTC的视频连接过程的一些讲解:

1、关于WebRTC这个库,虽然说它提供了点对点的通信,但是前提也是要双方都连接到服务器为基础,首先浏览器之间交换建立通信的元数据(其实也就是信令)必须要经过服务器,其次官方所说的NAT和防火墙也是需要经过服务器(其实可以理解成打洞,就是寻找建立连接的方式)
至于服务器那边,我不懂也不多说。

关于android客户端,你只需要了解RTCPeerConnection这个接口,该接口代表一个由本地计算机到远程端的WebRTC连接,提供了创建,保持,监控,关闭连接的方法的实现。
我们还需要搞懂两件事情:1、确定本机上的媒体流的特性,如分辨率、编码能力等(这个其实包含在SDP描述中,后面会讲解)2、连接两端的主机的网络地址(其实就是ICE Candidate)

通过offer和answe交换SDP描述符:(比如A向B发起视频请求)
比如A和B需要建立点对点的连接,大概流程就是:两端先各自建立一个PeerConnection实例(这里称为pc),A通过pc所提供的createOffer()方法建立一个包含SDP描述符的offer信令,同样A通过pc提供的setLocalDescription()方法,将A的SDP描述符交给A的pc对象,A将offer信令通过服务器发送给B。B将A的offer信令中所包含的SDP描述符提取出来,通过pc所提供的setRemoteDescription()方法交给B的pc实例对象,B将pc所提供的createAnswer()方法建立一个包含B的SDP描述符answer信令,B通过pc提供的setLocalDescription()方法,将自己的SDP描述符交给自己的pc实例对象,然后将answer信令通过服务器发送给A,最后A接收到B的answer信令后,将其中的SDP描述符提取出来,调用setRemoteDescription()方法交给A自己的pc实例对象。

所以两端视频连接的过程大致就是上述流程,通过一系列的信令交换,A和B所创建的pc实例对象都包含A和B的SDP描述符,完成了以上两件事情中的第一件事情,那么第二件事情就是获取连接两端主机的网络地址啦,如下:

通过ICE框架建立NAT/防火墙穿越的连接(打洞)
这个网址应该是能从外界直接访问的,WebRTC使用了ICE框架来获得这个网址,
PeerConnection在创立的时候可以将ICE服务器的地址传递进去,如:
private void init(Context context) {
PeerConnectionFactory.initializeAndroidGlobals(context, true, true, true);
this.factory = new PeerConnectionFactory();
this.iceServers.add(new IceServer(“turn:turn.realtimecat.com:3478”, “learningtech”, “learningtech”));
}
注意:“turn:turn.realtimecat.com:3478”这段字符其实就是该ICE服务器的地址。
当然这个地址也需要交换,还是以AB两位为例,交换的流程如下(PeerConnection简称PC):
A、B各创建配置了ICE服务器的PC实例,并为其添加onicecandidate事件回调
当网络候选可用时,将会调用onicecandidate函数
在回调函数内部,A或B将网络候选的消息封装在ICE Candidate信令中,通过服务器中转,传递给对方
A或B接收到对方通过服务器中转所发送过来ICE Candidate信令时,将其解析并获得网络候选,将其通过PC实例的addIceCandidate()方法加入到PC实例中.

这样连接就建立完成了,可以向RTCPeerConnection中通过addStream()加入流来传输媒体流数据。将流加入到RTCPeerConnection实例中后,对方就可以通过onaddstream所绑定的回调函数监听到了。调用addStream()可以在连接完成之前,在连接建立之后,对方一样能监听到媒体流。

下面是我运用sdk所做的代码实现流程:
1、首先在界面布局中,xml文件中所要显示视频的地方写好GLSurfaceV

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值