网站首页 > 技术文章 正文
0.引言
本篇文章主要讲解webrtc的通话原理的信令设计和媒体协商原理,理解整个信令交互的过程,对于理解webrtc音视频通话,具有很大的帮助。参考文章内容列表如下:
webrtc整体的一个通话原理的信令和媒体协商交互部分如下图示:
1.信令设计部分
A客户端通过join加入到信令服务器里面来。当B通过join加入到信令服务器,随后就会通知到A客户端。同理,信令服务器通过resp-join也会告诉B端,A端已经加进来了。
每次有新的客户端加进来时,那么就会调用New RTCPeerConnection,就会绑定onicecandidate等回调函数,比如这里的Peer-A。Peer-A再使用addTrack(track,localStream)去把本地流添加进来。详细交互如下图所示:
关键记住以下一些步骤:
(1)信令部分主要是两端的connect信令服务器。
(2)join房间。
(3)Peer-A和Peer-B获取到对端的remoteUid
(4)new RTCPeerConnection。
(5)addTrack(track,localStream)添加本地流。
2.媒体协商部分
媒体协商关键记住一些点,关键步骤如下:
(1)Peer-A端(发起端)的CreateOffer,Peer-B端(接收端)的CreateAnswer。
(2)Peer-A端和Peer-B端分别使用SetRemoteDescription和SetLocalDescription去设置SDP信息。
(3)Peer-A端和Peer-B端分别发送ICE Request信息,都能接收到对方的candidate信息。
(4)Peer-A端和Peer-B端相互接收对方的音视频数据。
(5)Peer-A端和Peer-B端的一方离开,或多方离开,就会通知对方并删除一些资源。
比如Peer-A端通过CreateOffer(拿到的是浏览器的信息,支持的媒体信息)端拿到SDP,并通过SetLocalDescription把这些信息,设置到本地,然后,Peer-A端也会把这些信息发送给对方,如这里描述的Peer-B端。Peer-B端收到Peer-A端的SDP信息后,也是会做同样的事情,分别调用New RTCPeerConnection,绑定onicecandidate等回调函数,并调用addTrack(track, localStream)添加本地流,通过setRemoteDescription设置对方传递过来的信息。Peer-B端也会通过CreateAnswer拿到本地浏览器支持的媒体信息,然后也是通过SetLocalDescription,设置到本地。Peer-B端并通过answer(回复的是sdp信息)去回复Peer-A。也就是说Peer-A发送offer给B端,那B端就一定要发answer给B端。当Peer-A端接收到Peer-B的answer信息后,那么Peer-A端会调用setRemoteDescription进行设置和保存。Peer-A和Peer-B在完成前面的工作后,就分别调用ontrack获取对端的码流,这个时候一般是拿到对方码流的句柄,但是这时候数据流还没有发出来。Peer-A通过ICE Request向coturn服务器发起打洞,并拿到地址后,就会调用oniceCandidate的回调方法,这个回调方法就是负责拿到打洞的地址,然后就可以向Peer-B端去发送candidate,Peer-B端拿到candidate信息后,就会通过addiceCandidate添加到自己的RTCPeerConnection。同理,Peer-B端向Peer-A也是一样的流程。如果是拿到多组candidate信息后,那就会相互匹配,如果匹配都不成功,就会去走中继了。无论是走中继成功还是拿到candidate成功后,两端就可以传输数据,然后使用音视频通话了。如果某一方要离开当前通话,那就会发送leave命令到信令服务器,这时候A端就会调用close方法(释放本地和远端的一些资源),信令服务器删除Peer-A并通知Peer-B,这是Peer-B就知道Peer-A已经离开了,Peer-B端调用close方法(释放本地和远端的一些资源)。Peer-A端和Peer-B端交互时序如下图所示:
注意:上面所说的这些函数,都是属于PeerConnection。offer和answer只是表示不同的方向,实际就是传递的都是sdp信息。ICE Request不会有一个顺序,对端都是相互请求,并不是Peer-A端发起ICE Request,才能由Peer-B端发起,互相不影响。只要是拿到这个candiate信息后,就会发送给对方。
3.总结
本篇文章讲解了信令交互的主要原理,欢迎关注,转发,收藏,点赞。
后面关于项目和音视频面试有关的知识,会发布在微信公众号,可以关注微信公众号"记录世界 fron antonio"
猜你喜欢
- 2024-10-02 一文看懂WebRTC建连过程 webrtc socket
- 2024-10-02 webrtc原理及相关api使用逻辑 webrtcvad
- 2024-10-02 网页端WebRTC推流转换为RTMP/GB28181等其他直播流协议
- 2024-10-02 FaceTime终直面WebRTC:deep dive实现(上)
- 2024-10-02 音视频流媒体开发WebRTC 基础知识 -- ICE 交互总结
- 2024-10-02 FaceTime终直面WebRTC:deep dive实现(下)
- 2024-10-02 webRTC 连接建立原理演示 webrtc怎么用
- 2024-10-02 资讯|WebRTC M98 更新 webrtc mediastream
- 2024-10-02 WebRTC客户端主要流程分析 webrtc internals
- 2024-10-02 WebRTC 入门教程:WebRTC信令控制与STUN/TURN服务器搭建
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)