OWT是Intel前些年开源的基于互联网的视频会议解决方案,可以支持WebRTC和SIP终端。这几年WebRTC应用的特别广泛,使用OWT可以快速搭建一个WebRTC视频会议系统。OWT最初仅支持MCU模式,也就是服务器混流,客户端仅可订阅一路音视频即可,后来新版本也支持SFU模式。
OWT 项目地址 https://github.com/open-webrtc-toolkit , 包含服务器端 OWT-Server 和 各种客户端程序。
我是做服务器开发的,后续主要分享 OWT-Server 相关的内容,因认知有限,有错误欢迎提出,有问题尽可留言交流。
从代码结构上讲,OWT-Server 底层业务使用 C++ ,对WebRTC库就行封装,ICE协商部分使用的 libnice
库。 上层业务逻辑使用的 Node.js
编写的。作为一个C++ 码农,不得不说用Node.js写业务真是比C++爽太多了~
对于学习来说,先跑个demo看看现象,才能知道这玩意能不能满足需求。
我用目前最新的OWT-Server 5.0 版本,编译打包后制作了一个docker镜像,里面包含了Web端的Demo,拉下来直接run应该就可以体验了。
先来个最简单的,使用host模式哦~ 省的映射端口了。
docker run -d --name owt-demo --network host lmshao/owt-server
Web 观看地址:https://localhost:3004/ 。注意是https的,因为是默认假的证书,所以浏览器有提醒,确认一下就可以了。正常入会如下图显示,中间大方块是一路mix媒体流,上面小图是本地回显。
关于这个镜像的使用可以参考 docker hub : lmshao/owt-server。
不使用host网络模式启动容器
3004 是web端口,8080是webrtc信令端口,15672是RabbitMQ web控制台管理端口,3300是会议配置web控制台端口。这种模式启动应该只能在本机web参会,不能在同一局域网其他机器入会。
docker run -d --name owt-demo \
-p 3004:3004 \
-p 8080:8080 \
-p 15672:15672 \
-p 3300:3300 \
lmshao/owt-server
之所以强调是正常流程,是因为OWT用到很多第三方库,最重要的是WebRTC库需在在线安装配置,众所周知的原因,境内的服务器是没法正常使用的。可以看下面 “曲线救国” 章节介绍。
如果用的是境外的服务器或者用小飞机之类的代理工具,就可以按照Github owt-server页面README
进行配置就好了,主要由下面几个步骤。官方指定系统Ubuntu 18.04 或者CentOS 7.6,我亲自试了Ubuntu20.04默认会报一些错误。
OWT-Server git clone 或者直接下载 Release 包。
这一步非常慢,并且需要连谷歌等外网!
scripts/installDepsUnattended.sh
scripts/installDepsUnattended.sh
scripts/pack.js -t all
如果要把官方web demo打包进去的话,可以使用下面命令
scripts/pack.js -t all --install-module --app-path ${webrtc-javascript-sdk-sample-conference-dist}
--install-module
指定是打包的时候安装node.js依赖,${webrtc-javascript-sdk-sample-conference-dist}
目录是 owt-client-javascript 打包生成的dist目录。具体 owt-client-javascript 打包方法直接看它的README
吧。
上不了外网安装依赖失败的看这里,编译报错八成也是因为安装依赖报错了。
这个方法也适用于把代码 COPY 到别的路径编译不通过。
摸索到一个好方法,就是在境外服务器上下载安装依赖后,把文件夹直接拿过来使用。没有境外服务器可以在 Vultr 上买一个按时间付费的服务器,用完直接删除,也就几毛钱的事。
假设你已经在别的服务器上执行 scripts/installDepsUnattended.sh
安装完了依赖,把代码COPY到了你的服务器。这时候你直接编译已经是会报错的,因为有一些依赖里面使用的是绝对路径,导致还是找不到相应第三方库,即使已经在你的 owt-server 目录里面了。
安装依赖后第三方库的信息在这个build/libdeps/build/lib/pkgconfig
目录下面,可以看看里面.pc
文件中的库的路径是绝对路径。然后把这些库里面的所有路径都设置为你当前代码所在的路径就应该可以了。
举个栗子,假如你第一次安装依赖的时候owt目录为/root/owt-server-5.0
,那你.pc
文件里面应该就有/root/owt-server-5.0
字样,可以sed命令全替换为当前路径。
比如:
# 可以先备份一下build/libdeps/build/lib/pkgconfig 防止改呲花了
cd owt-server-5.0
sed -i "s;/root/owt-server-5.0;$PWD;g" build/libdeps/build/lib/pkgconfig/*.pc
现在应该就可以正常编译了。如果还是有一些库链接不到,那就 find
它所在的目录,然后直接 export LD_LIBRARY_PATH=/XXXX
或者export PKG_CONFIG_PATH
,实在不行最简单粗暴的方法就是在线安装那个库,前提是仓库里有那个库。
OWT server 是模块化的框架,也就是说信令模块,混流模块和会控等模块是分离的,可以分布式集群化部署。其他优点可以去看其他的介绍类文章,或者LiveVideoStack大会PPT。
OWT 作为一个开源的视频框架,完全可以在此基础上增加一些业务逻辑进行商用。近两年的LiveVideoStack大会,好像每次都有人专门讲OWT的应用。
OWT 媒体层使用C++开发,上层业务逻辑使用Node.js开发,写业务逻辑是真的快,接触OWT后我也是新学的Node.js,使用 Node.js 唯一不香的是 OWT 内部数据结构 代码中没有定义,不像C++看个头文件就知道这个结构里面都是啥,这点对于初学者来说不是很友好。
后续有时间再细致聊聊这两三年中遇到的坑,简单的问题可以留言交流。