本demo渲染使用opengl,音频采集使用alsa,视频采集使用v4l2+/dev/video。
在设计多个平台时,MetaRTC的源码和google的c++ webrtc源码都使用了工厂模式的方法,比如以下不同平台的视频采集为例子。YangVideoCaptureLinux是实现linux平台的,除此之外还有其他平台的类如win,android,os_apple等。他们通过工厂类生成返回给YangPushCapture类。
这里MetaRTC还模仿QT的run()和start()线程机制,实现了自己的YangThread类。比如在YangVideoCaptureLinux多重继承了YangThread,那么在YangVideoCaptureLinux类中重写startLoop()后,只要调用通过YangThread继承来的start()函数,就会另外开一个线程执行startLoop()内的函数。在MetaRTC中只要无法用QT的Thread的地方,都是用这种方式开的线程。
以下是推流客户端的主要流程,从点击推流按钮,到开始采集AV数据,开始AV编码,开始建立推流连接推流,并自行渲染采集到的本地视频。
这里有两大线程特别重要,1.调用全局函数void yang_post_message(int32_t st, int32_t uid, YangSysMessageI mhandle,void user)将放入宏定义放入队列。2.另开线程调用void handleMessage(YangSysMessage *mss)函数根据不同的宏定义,分别执行开始video/screen采集,切换,推流whip/webrtc等(采集AV数据,AV编码,建立推流连接推流)。
理解了这两个线程,就能梳理这个demo的主框架。
如果想要去掉QT,改为cmake工程管理,把渲染部分去掉就可以。
下方是笔者微信,备注webrtc爱好者