关于WebRTC

这两天闲来无事,从前天开始就看起了WebRTC。
以前boss说要让我搞一个P2P穿透的库出来,因为对libjingle了解一点,知道他完整地实现了ICE,而且是Google做的,所以就从这个入手了。结果几天下来,是云里雾里啊。C++中的那些各种继承,各种指针,各种类,哎妈,不说了。不过通过读官方文档,还是了解了一些概念,也感觉设计的挺不错的,记忆尤深的就是传输数据时他会动态切换速度最快的candidate。可最后还是放弃了,代码太难读懂了,也许是我历练的少吧。
直到遇到了libnice,才知道什么是简洁。可是libnice只有ICE,考虑到以后很可能要和媒体数据传输相结合,于是选择了pjsip,一个设计良好,跨N多平台,小巧简练的库,我把他里面的pjnath子库封装了一下,就算交了差。
这两天查到说WebRTC是要朝着集成到浏览器中的目的去的,而且已经被chrome,firefox和opera支持了,说已经有数十亿设备支持等等。就看了一下,发现大部分代码就是重用libjingle的,然后定义了一套对外统一的接口,有js的,HTML5的和native API。libjingle已经不单独维护了,SVN的log里记录,大概2013年8月就停止更新了,最后一条写着“has been moved to WebRTC”。
checkout和build就废了我好大的劲,幸亏以前弄过libjingle,工具都装过,具体步骤就不写了,能搜到的,但需要注意的是最新的webRTC在Windows上已经不支持vs2008及以前的版本了,因此我又装了个vs2013 express,但又没有ATL和MFC的库,MFC无所谓,但webRTC包含了altbase.h等头文件,所以直接指向vs2008的ATL对应目录即可。这样应该就没什么问题了。
一上来当然是run一下example,找了找,正好有个peerconnectionclient和peerconnectionserver,试了下,有几次直接崩溃,但是还是能运行的,比较严重的问题是在我的笔记本上运行3分钟左右会卡死,简单瞅了一下,应该是一个关键段死锁了。
这咋用,bug懒得改了,还是去看看以前搞的libjingle吧,看看能不能用。试了下,还真能用,没什么大问题,运行挺稳定,唯一缺点就是太耗CPU,50%被他占去了(我用pjmedia搞的对讲模块,平均占用CPU 8%)。看了下client的代码,采集用DirectShow,显示用的是GDI。但我看到他的代码库中有video render模块,而且支持好几个平台,Windows下是用的Direct3D9,于是尝试用D3D实现显示。
又看了一大堆类的代码,然后写了点代码,到最后发现对接的时候一个表示一帧I420数据的类竟然有2个实现!分别是在webrtc命名空间和cricket命名空间里,一个叫VideoFrame,一个叫I420VideoFrame,哎,懒得转了,直接构造一个空I420VideoFrame丢给了renderer最后给了D3D,粉色图像最后还是出来了,先这样吧。估计我也不会用它。
目前看来WebRTC还是很不成熟的,文档太少,而且个人感觉太乱,可能是有历史包袱的原因吧。优化可能还不够,我也看到Google已经针对SSE优化过libvpx了,但是还是会占这么多CPU。而且我不明白为什么要针对一帧420数据实现2个类!(这俩类的功能还都挺全的,也就是说挺复杂的,也就是说代码挺多的!呃,我不喜欢这么多的高耦合代码)