文章目录
- 接口代理框架
- Proxy体系类结构
- 导出接口
- webrtc的实际运用
- PeerConnectionFactoy
- PeerConnection
- 使用
接口代理框架
webrtc体系庞大,模块化极好,大多数模块都可以独立使用。模块提供接口,外部代码通过接口来使用模块功能。
在webrtc中通过一种接口代理的方式,来封装了对外的接口。下面是其接口架构图:
业务应用通过一层proxy来使用webrtc通过功能,也就是应用层与webrtc通过proxy隔离。
这种方式有如下好处:
- 只输出必要的接口。
- 灵活方便,当需要将接口从WebRTC中导出时,就通过Proxy导出。
- 防止应用层污染WebRTC,比如通过Proxy指定了需切换的线程,这样就可以按应用层的线程切换到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;
}
- 在WebRTC内部实现接口类。
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_
上。
关于RefCountInterface 看看这篇文章
webrtc的实际运用
PeerConnectionFactory
和PeerConnection
就是使用这套接口体系。
PeerConnectionFactoy
(类图中我列出了类所在的文件名,方便查看代码,列出了几个核心的接口)
PeerConnectionFactoryInterface
为接口类,继承自rtc::RefCountInterface
。PeerConnectionFactory
为内部实现类。PeerConnectionFactoryProxy
为对外的代理类,由宏生成,提供Create
方法产生接口的实例。
应用层通过PeerConnectionFactoryProxy
的Create
方法获取PeerConnectionFactoryInterface
的实例。
PeerConnection
(类图中我列出了类所在的文件名,方便查看代码,它的接口太多,这里就不列出了)
PeerConnectionInterface
为接口类,继承自rtc:RefCountInterface
。PeerConnection
为内部实现类。PeerConnectionProxy
为对外的代理类,由宏生成,提供Create
方法产生接口的实例。
应用层通过PeerConnectionProxy
的Create
方法获取PeerConnectionInterface
的实例。
webrtc的接口类都在src/api
中,使用Proxy架构的还有MediaStreamInterface
,DataChannelInterface
等。
使用
可以看看examples/conductor.h
是怎么使用pc和pc factory。