webrtc体系庞大,模块化极好,大多数模块都可以独立使用。模块提供接口,外部代码通过接口来使用模块功能。
在webrtc中通过一种接口代理的方式,来封装了对外的接口。下面是其接口架构图:
业务应用通过一层proxy来使用webrtc通过功能,也就是应用层与webrtc通过proxy隔离。
这种方式有如下好处:
在webrtc中需要导出的接口,采用的是如上的类体系。
其中代理类是通过一系列宏生成,自动生成一个类xxxProxyWithInternal
,其中最重要的方法就Create
方法,它将产生接口类的实例类,供应用使用。
宏的定义在api/proxy
文件中,这里就不展开叙述了,可以直接看看代码,是怎么使用的。
实现了一个自定义功能类Test
,通过Proxy的方式导出接口,有如下几步:
TestInterface
,有功能接口func1
和func2
,继承rtc::RefCountInterface
。class TestInterface:public rtc::RefCountInterface {
public:
virtual void func1() = 0;
virtual void func2() = 0;
}
class Test:public TestInterface {
public:
void func1();
void func2();
};
BEGIN_PROXY_MAP(Test)
PROXY_SIGNALING_THREAD_DESTRUCTOR()
PROXY_METHOD0(void,func1)
PROXY_WORKER_METHOD0(void,func2)
END_PROXY_MAP()
TestProxy
类,包括两个线程对象signal_thread_
,worker_thread_
,内部有一个实现了TestInterface
的实例指针,通过Proxy暴露的接口直接转调到这个实例对象。Create
方法,对外返回的TestInterface
的实例。PROXY_METHOD0
包装方法func1
,对func1
的调用将放到signal_thread_
线程上,PROXY_WORKER_METHOD0
包装func2
方法,对func2
的调用将放到worker_thread_
上。PeerConnectionFactory
和PeerConnection
就是使用这套接口体系。
(类图中我列出了类所在的文件名,方便查看代码,列出了几个核心的接口)
PeerConnectionFactoryInterface
为接口类,继承自rtc::RefCountInterface
。PeerConnectionFactory
为内部实现类。PeerConnectionFactoryProxy
为对外的代理类,由宏生成,提供Create
方法产生接口的实例。应用层通过PeerConnectionFactoryProxy
的Create
方法获取PeerConnectionFactoryInterface
的实例。
(类图中我列出了类所在的文件名,方便查看代码,它的接口太多,这里就不列出了)
PeerConnectionInterface
为接口类,继承自rtc:RefCountInterface
。PeerConnection
为内部实现类。PeerConnectionProxy
为对外的代理类,由宏生成,提供Create
方法产生接口的实例。应用层通过PeerConnectionProxy
的Create
方法获取PeerConnectionInterface
的实例。
webrtc的接口类都在src/api
中,使用Proxy架构的还有MediaStreamInterface
,DataChannelInterface
等。
可以看看examples/conductor.h
是怎么使用pc和pc factory。