目录
1.2.3 创建并添加本地音频轨到PeerConnection - AddTracks
1.2.4 创建Offer,CreateOffer
1. Smack Android Demo
1.1 WebRtc 交互流程图
两个客户端按照Session Description Protocol(SDP协议)交换双方的元数据。
- 天蓝色背景表示两个需要建立P2P通信的两个端点,端上运行着peerconnect_client程序。其中呼叫端成为Caller,被呼叫端为Callee。在端上执行的步骤均以黑色字体展现。
- 粉色背景表示的是信令服务器,运行着peerconnect_server程序。端与服务器的信令交互过程也以粉色字体展示。
- 橘红背景表示的是STUN服务器,运行着STUN服务器程序。工程中以谷歌提供的STUN服务器作为STUN测试服务器,地址为"stun:stun.l.google.com:19302"。端与STUN服务器的交互也以橘红色的字体展示。
- 以绿色字体展示端与端之间的音视频传输。
1.2 源码分析
当WebRTC的端与信令服务器建立连接之后,可以通过与服务器的信令交互获知对等端点的存在,进一步通过信令向对端发起呼叫。在发起呼叫之前,发起方需要在本地做一些初始化工作,创建两个重要的对象:PeerConnectionFactory和PeerConnection。
1.2.1 创建PeerConnectionFactory
PeerConnectionFactory提供的能力——公有方法
- 创建PeerConnection:CreatePeerConnection();
- 创建音频源:CreateAudioSource(),为创建音频Track提供参数;
- 创建视频轨:CreateVideoTrack();
- 创建音频轨:CreateAudioTrack();
- 获取ChannelManager:channel_manager();
1.2.2 创建PeerConnection
PeerConnectionObserver是PeerConnection的回调接口,应用层可以必须提供回调接口的实现,以便响应PeerConnection的事件。这些接口大致分为如下几类:
状态相关回调:
- OnSignalingChange:信令状态改变。
- OnConnectionChange:PeerConnection状态改变。
远端流或者轨道的添加或者移出:
- OnAddStream:收到远端Peer的一个新stream。
- OnRemoveStream:收到远端Peer移出一个stream。
- OnAddTrack:当一个receiver和它的track被创建时。Plan B 和 Unified Plan语法下都会被调用,但是Unified Plan语法下更建议使用OnTrack回调,OnAddTrack只是为了兼容之前的Plan B遗留的接口,二者在同样的情况下被回调。
- OnTrack:该方法在收到的信令指示一个transceiver将从远端接收媒体时被调用,实际就是在调用SetRemoteDescription时被触发。该接收track可以通过transceiver->receiver()->track()方法被访问到,其关联的streams可以通过transceiver->receiver()->streams()获取。只有在Unified Plan语法下,该回调方法才会被触发。
- OnRemoveTrack:该方法在收到的信令指示某个track中将不再收到媒体数据时触发。Plan B语法下,对应的receiver将被从PeerConnection中移出,并且对应track将被设置为muted状态;Unified Plan语法下, 对应的receiver将被保留,对应的transceiver将改变direction为仅发送sendonly 或者非活动inactive状态
ICE过程相关:
- OnRenegotiationNeeded:需要重新协商时触发,比如重启ICE时。
- OnIceCandidate:收集到一个新的ICE候选项时触发。
- OnIceCandidateError:收集ICE选项时出错。
- OnIceCandidatesRemoved:当候选项被移除时触发。
- OnStandardizedIceConnectionChange:符合标准的ICE连接状态改变。
- OnIceGatheringChange:ICE收集状态改变。
- OnIceConnectionReceivingChange:ICE连接接收状态改变。
- OnIceSelectedCandidatePairChanged:ICE连接所采用的候选者对改变。
DataChannel相关:
- OnDataChannel:当远端打开data channel通道时触发。
1.2.3 创建并添加本地音频轨到PeerConnection - AddTracks
初始化本地的媒体,也即创建本地的音频轨(AudioTrack)、视频轨(VideoTrack)、数据通道(DataChannel),并将这些本地的媒体轨道添加到PeerConnection对象中。
1.2.4 创建Offer,CreateOffer
可调用PeerConnection::CreateOffer()创建本地SDP对象。
CreateOffer方法执行过程是比较明朗的,也有必要将涉及的基本观念、设计方式交代下:
- WebRTC中将CreateOffer、CreateAnswer、SetLocalDescription、SetRemoteDescription、AddIceCandidate这5个与SDP会话相关的API认为是一个Operation,这些Operation必须是挨个执行,不能乱序,不能同时有两个交互执行。因此,设计了一套操作链的接口,由OperationsChain类提供此功能。当链入一个操作时,如果队列中没有其他操作,那么该操作会被立马执行;若是操作链中存在操作,那么本操作就入队操作链,等待上一个操作执行完成之后,以回调的形式(即上述代码中的operations_chain_callback回调方法)来告知执行下一步操作。
- CreateSessionDescription,ObserverOperationWrapper相当于一个封装了 "Offer操作结果回调 + 操作链操作完成回调"的一个对象,一直沿着CreateOffer调用链往下传,直到能够判断是否能成功创建Offer的地方,创建Offer这个操作完成的地方,然后去触发其承载的回调函数,以便告知上层操作结果,然后触发下一个操作。具体见源码
1. webrtc服务器janus android客户端编译学习三
2. WebRTC入门系列2:RTCPeerConnection
2. Janus 服务器
4.Janus源码分析(4)——信令交互过程