最近想了解一些在浏览器中推送音视频流,寻找很多版本的代码,C++、Go、Python等语言实现的webRTC协议。
按照搭建难度和快速实现首选Python版本的WebRTC,这种是最适合原型开发的。
选型:C++的开源库libdatachannel
Python的开源库AioRTC
libdatachannel:看这个名字,并且对WebRTC协议稍微了解的可能认为它是只实现了WebRTC的datachannel功能。实际不然,它拥有完整的WebRTC的协议内容,并且具有很多示例程序帮助学习,并且有很好的维护状态。它不像谷歌的WebRTC项目,极其轻量。国产的MetaRTC也是一个很不错的WebRTC项目,也提供了很不错的示例代码,他的示例部分运行效果较差,教程写的也不是很好,我是没有完全走通逻辑。
AioRTC:它本身使用的是异步Async IO RTC,都使用Python了代码的效率就可以先不关心了。
重点学习的地方:
AioRTC项目代码中,有一个文件夹examples/webcam,安装完依赖里面的示例代码可以直接运行。然后在浏览器中输入${那台电脑的IP}:8080,就能直接看到推送的视频流,能够很快的搭建起来一个原型。细心的你会发现,这个过程虽然是使用了webRTC,但是那几个服务器怎么没看到?信令服务器,中转服务器等。当然这几个所谓的服务器,是为了信息的交换才有的。如果只在本地,webcam示例就是http和js,是使用aiohttp搭建的网页服务,它实现了一个offer的路由,可以直接将webRTC通信需要的一些参数通过post实现了交换。在网页端点击开始按钮,走的就是这一流程。
libdatachannel项目中,有一个文件夹examples/streamer,里面有个READEME.md介绍了很详细的当前示例中的如何运行起来信令服务器,网页服务器,也是相对较为容易得搭建起来一套WebRTC学习环境。这个项目他的编译方式在其他的README.md有很详细的介绍,按照流程即可。
那么非常基础的环境搭建好了,能否使用两个项目的示例结合进行一些有趣的试验。很多开源项目的示例可能仅对当前项目内容负责,或者主动兼容其他好的项目。
使用libdatachannel中的示例,搭建起信令和网页服务器,然后使用AioRTC中的webcam示例将视频流推送到信令和网页服务器上,并且能够正常播放视频流。
很显然是可行的,根据搭建的记录,会发现libdatachannel的信令服务器是使用websockets实现的,那么在webcam示例中将aiohttp移除掉,引用websocket,简单的修改一下连接到信令服务器,网页启动会js自动连接信令服务器,点击开始会向信令服务器发送request server,信令服务器收到后会把这个request转发给webcam的ws中,webcam在创建流轨道,把sdp发送给信令服务器,信令服务器将这个sdp转发给网页客户端,下一步网页服务器会发送本机的sdp给信令服务器,信令服务转发这个消息给webcam。接下来webcam进行推流,如果顺利网页就能看到视频了