WebRTC作为一个工具箱,相较于传统的视频会议有更好的安全性、良好的兼容性、增强网络的优势。但是WebRTC并不是一个完整的视频会议系统,它是一套内置在浏览器中的工具,经过我们对webrtc的不断研究,目前也实现了EasyGBS中webrtc的视频播放。
在我们的开发中,需要了解Webrtc的PC Factory拥有三个线程:
-
Signaling_thread_: 这个是所有PC Factory和PC的对外接口,执行都会切换到signaling_thread_,而PC Observer所有的回调函数也都会在signaling_thread_执行。
-
Network_thread_:这个线程主要是和网络相关的操作,都会在network_thread_执行,比如收到和发送音视频、文字数据包;绑定网络端口号等。
-
Worker_thread_:这个是和网络无关的可能耗时的操作,都会在worker_thread_执行。
webrtc主要是怎么使用这三大线程的,其实线程的使用主要还是在线程上执行代码和线程间的切换。
对于Windows/Linux创建PC Factory调用的是webrtc::CreatePeerConnectionFactory,对于它的实现代码在api/create_peerconnection_factory.cc中。调用代码如下:
peerConnectionFactory = webrtc::CreatePeerConnectionFactory(
Nullptr/*network_thread_*/, nullptr/*worker_thread_*/, nullptr/*signaling_thread_*/, nullptr, webrtc::CreateBuiltinAudioEncoderFactory(), webrtc::CreateBuiltinAudioDecoderFactory(),
webrtc::CreateBuiltinVideoEncoderFactory(),
webrtc::CreateBuiltinVideoDecoderFactory(),
nullptr, nullptr
);
复制代码
因此是由PC Factory的构造函数创建、启动network_thread_he worker_thread_,并把调用webrtc::CreatePeerConnectionFactory的线程包装为signaling_thread_。此线程要么是主线程,要么是websocket线程。
分析webrtc::CreatePeerConnectionFactory创建的线程的要点包括以下5点:
A、首先创建实现类对象,即创建PeerConnectionFactory函数
B、接着再调用PeerConnectionFactoryProxy::Create创建代理对象
C、如果PC Factory的第一个参数为nullptr时,即调用的方法没有提供network_thread_参数,webrtc会自动调用rtc::Thread::CreateWithSocketServer()创建并启动网络线程
D、如果PC Factory的第二个参数也没有提供(worker_thread_),就会调用rtc::Thread::Create()来创建并启动耗时相关线程
E、如果PC Factory的第三个参数没有提供,因为signaling_thread_比较特殊,没有提供时,那么webrtc是不会创建新的线程,而是把当前的线程进行包装一下作为signaling_thread_来用。