目录
1、概述
2、环境准备
2.1安装docker
2.2下载docker-compose
2.3Linxu内核参数调优
3、安装运行
3.1拉取docker镜像
3.2运行目录准备
3.3生成测试证书
3.4获得服务器License字串
3.5编辑docker-compose的配置文件
3.6启动服务器
4、测试验证
1、概述
想搭建一个自己的视频会议系统吗?本文将指导你一步一步从零开始搭建一个视频会议系统。
webrtc技术是目前业内最流行的音视频传输技术,最初接触音视频开发的同学使用webrtc客户端,可以快速的实现点对点视频聊天。不过在实际使用过程中,通常需要多方视频通话。因此,除了webrtc客户端以外,还需要一个webrtc服务端来为参与通话的各方提供视频的转发服务。关于webrtc服务端的更详细的技术介绍,本专栏将持续更新。
想要了解多方视频会议系统,最好的方法莫过于亲自搭建一套来玩玩。下面将介绍如何快速搭建。rtcms一个基于webrtc的多功能媒体服务器,可为多种终端(webrtc,sip,rtmp,hls等)提供音视频服务,即稳定可靠,也开放免费,不光可用于视频会议,视频客服等视频通话场景,也可以用于直播,安防,教育,AI图像传输,游戏服务器等场景。搭建过程非常简单,我们来开始吧:
2、环境准备
首先我们要找一台机器作为服务端。服务端可以选择多种操作系统,如Centos,Ubuntu,Windows server或者Win10。我已经将rtcms发布到dockerhub上,因此最快的方式是基于docker来安装运行。
下面我以Ubuntu/Centos等Linux服务器为例:
2.1安装docker
linux服务器中安装docker网上有很多指导,这里我们用最简单的官方安装脚本的方式。如果你的网络环境比较“科学”,那可以用root用户执行:
#curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
如果是普通网络条件,可以用下面的国内镜像方式:
#curl -sSL https://get.daocloud.io/docker | sh
2.2下载docker-compose
docker-compose是一个docker容器管理工具,实际应用的比较多,使用也很方便,安装过程非常简单,是个绿色软件,用curl下载下来后改个名字,赋上可执行权限就可以了(呃,希望你的网络能正常访问github...),本文将它放到/usr/local/bin/下是为了不用配置PATH环境变量就可以直接使用这个工具。
#curl -L "https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#chmod +x /usr/local/bin/docker-compose
到目前为止,如果只是自己测试感受一下,环境就已经完毕了。当然,如果是正式用于生产环境,最好再对linux的内核参数进行一下调优。
2.3Linxu内核参数调优
#vi /etc/sysctl.conf
将sysctl.conf文件的内容替换为:
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.accept_source_route = 0
net.core.somaxconn = 2048
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.unix.max_dgram_qlen = 65535
net.ipv4.tcp_syncookies = 1
kernel.sem = 250 32000 100 128
kernel.shmmax = 629145600
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.msgmnb = 65536
kernel.msgmni = 2878
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 2097152
net.core.wmem_default = 262144
net.core.wmem_max = 2097152
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
vm.hugetlb_shm_group = 1000
vm.max_map_count=655360
3、安装运行
rtcms有单机和集群两种运行方式,最简单的是单机运行方式。本文介绍单机下如何运行,对于集群方式,放在后续文章中介绍。
3.1拉取docker镜像
使用docker pull命令,在root用户下用下面命令格式从dockerhub上拉取镜像:
#docker pull zwancqcn/rtcms
等待一段时间,等镜像拉取完成后,可以使用下面命令查看到镜像:
docker images
正常情况下,可以看到名称为zwancqcn/rtcms的镜像信息:
REPOSITORY TAG IMAGE ID CREATED SIZE
zwancqcn/rtcms 2.7 e284c2a5b51f 7 days ago 2.48GB
3.2运行目录准备
在服务器上找一个运行根目录,本文以/home/rtcms目录为例,创建需要的目录结构:
#mkdir -p /home/rtcms/nginxcerts
#mkdir -p /home/rtcms/nginxlog
#mkdir -p /home/rtcms/oamlog
#mkdir -p /home/rtcms/rtcmslog
#mkdir -p /home/rtcms/record
对这几个目录做个解释:
nginxcerts子目录:由于chrome、firefox等现代浏览器的安全要求,webrtc应用必须运行在https方式下,因此docker容器内部使用了nginx来发布https服务。nginx的https证书存放到nginxcerts目录下。
nginxlog子目录:存放nginx的日志文件。
oamlog子目录:docker容器内部使用springboot来提供了rtcms管理台的后台服务。oam的日志存放在该目录中。
rtcmslog子目录:rtcms核心程序的日志目录,包含rtcms中用C/C++编写的所有核心模块的日志。
record目录:存放录像、断流图片等媒体文件的目录。
在准备好目录后,下面在nginxcerts目录下来生产nginx所需要的证书。如果你的服务器有域名并且有相应的ssl证书,那直接放到nginxcerts子目录中即可。如果没有,为了测试需要,需要自己做一个测试证书,步骤如下:
3.3生成测试证书
首先安装openssl,以ubuntu为例,用apt安装:
#apt install openssl
在nginxcerts子目录创建根证书,首先需要一个私钥,用下面命令创建:
#openssl genrsa -out /home/rtcms/nginxcerts/ca-key.pem 1024
创建根证书请求:
#openssl req -new -out /home/rtcms/nginxcerts/ca-req.csr -key /home/rtcms/nginxcerts/ca-key.pemCountry Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:cq
Locality Name (eg, city) []:cq
Organization Name (eg, company) [Internet Widgits Pty Ltd]:test
Organizational Unit Name (eg, section) []:test
Common Name (eg, YOUR name) []:root
Email Address []:test
A challenge password []:
An optional company name []:
生成自签名根证书:
#openssl x509 -req -in /home/rtcms/nginxcerts/ca-req.csr -out /home/rtcms/nginxcerts/ca-cert.pem -signkey /home/rtcms/nginxcerts/ca-key.pem -days 3650
创建完根证书后,继续创建服务器证书私钥:
#openssl genrsa -out /home/rtcms/nginxcerts/server-key.pem 1024
创建服务器证书请求:
#openssl req -new -out /home/rtcms/nginxcerts/server-req.csr -key /home/rtcms/nginxcerts/server-key.pemCountry Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:cq
Locality Name (eg, city) []:cq
Organization Name (eg, company) [Internet Widgits Pty Ltd]:test
Organizational Unit Name (eg, section) []:test
Common Name (eg, YOUR name) []:192.168.1.246 # 注释:一定要写服务器所在的ip地址
Email Address []:test
A challenge password []:
An optional company name []:
生成自签名服务器证书:
#openssl x509 -req -in /home/rtcms/nginxcerts/server-req.csr -out /home/rtcms/nginxcerts/server-cert.pem -signkey /home/rtcms/nginxcerts/server-key.pem -CA /home/rtcms/nginxcerts/ca-cert.pem -CAkey /home/rtcms/nginxcerts/ca-key.pem -CAcreateserial -days 3650
3.4获得服务器License字串
rtcms需要配置License字符串才能正常启动,license机制并非意味这rtcms需要付费,主要是获得用户联系方式方便后续更好的提供支持。通过以下的docker命令获得服务器硬件指纹字符串:
#docker run --rm --net=host --name=rtcms -v /dev/disk/by-uuid:/dev/disk/by-uuid zwancqcn/rtcms:2.0starting rtcms
Machine ID:GenuineIntel-1F8BFBFF-00050657-00000000-00000000Diskid:0070121e-e6fb-4b06-afdc-15c65fcac9d67fe02849-d810-401f-b7f8-e5782ca5939d
missing module type, exit with error
执行docker run命令后出现类似上面的输出,Machine ID后面的字符串 GenuineIntel-1F8BFBFF-00050657-00000000-00000000Diskid:0070121e-e6fb-4b06-afdc-15c65fcac9d67fe02849-d810-401f-b7f8-e5782ca5939d 就是服务器硬件指纹。
访问 https://meeting.zwan.com.cn:2337/#/web/license ,在机器码字段中输入服务器硬件指纹字符串,其它字段可以填你的联系方式,也可以随便填。提交后将获得license字符串,拷贝下来供下一步使用。
3.5编辑docker-compose的配置文件
在/home/rtcms运行根目录中新建docker-compose.yml配置文件,参考下面内容,需要改的就是把几个IP字段更改为你的服务器IP,另外填写上license字串就可以了:
version: '3'services:rtcms:container_name: rtcms-appimage: zwancqcn/rtcms:2.0network_mode: "host" environment:#Module type: rtcgw|zwmp|allType: "all" #单服务器固定为all#Module configurationModuleID: "1"ModuleIP: "192.168.1.100" #填写成此服务器私网IP地址ModulePort: "2339"License: "MzM4ZTg0MGRiZWEyMDVjNmFiYWVhYTA5OTE4MmY0YTAg" #填写上一步获得的licensePublicIP: "192.168.1.100" #填写成此服务器的公网IP地址,如果是测试,填写私网IP即可#RTCGW Module configuration WSPort: "2338" //信令websocket的tcp端口,docker内部使用,不用在防火墙上开放给客户端网络StunPort: "2331" //stun端口,tcp和udp同时监听,需要在防火墙上开放给客户端网络LOGPort: "2336" //维护websocket的tcp端口,docker内部使用,不用在防火墙上开放WEBPort: "2337" //对外的https和wss服务端口,需要在防火墙上开放给客户端网络SIPPort: "2333" //对外的sip服务端口,如果需要接入sip线路和终端,则需要开放,否则无用WEBCertPem: "server-cert.pem" //上一步生成的服务器测试证书WEBCertKey: "server-key.pem" //上一步生成的服务器测试证书key#ZWMP Module net configurationRtcgwModuleID: "1"RtcgwModuleIP: "192.168.1.100" #填写成此服务器私网IP地址RtcgwModulePort: "2339" ZwmpStunIP: "192.168.1.100" #填写成此服务器私网IP地址ZwmpStunPort: "2331" //和StunPort一致RTMPPort: "2334" //rtmp服务端口,tcp,如果不需要rtmp服务,可忽略AudioPortMin: "44000" //sip音频媒体端口段,不需要sip终端接入时可忽略AudioPortMax: "44299" VideoPortMin: "44300" //sip视频媒体端口段,不需要sip终端接入时可忽略VideoPortMax: "44599" WebrtcPortMin: "44600" //webrtc视频媒体端口段,需要在防火墙上开放给客户端网络WebrtcPortMax: "44999"#ZWMP Module parameterAudioChanNum: "100" //音频通道数VideoChanNum: "100" //视频通道数AudioThreadNum: "2" //音频线程数,如果是8核cpu服务器,可选2,即用2个内核跑音频线程VideoThreadNum: "6" //视频线程数,如果是8核cpu服务器,可选6,即用6个内核跑视频线程NoStreamPicFile: "nostream.bmp" //MCU会议模式时,如果终端未推流,则用这个图片代替视频volumes:- "/dev/disk/by-uuid:/dev/disk/by-uuid"- "/home/rtcms/rtcmslog:/home/rtcms/log"#RTCGW- "/home/rtcms/oamlog:/home/rtcms/web/oam/log"- "/home/rtcms/nginxlog:/home/rtcms/web/nginx/logs"- "/home/rtcms/nginxcerts:/home/rtcms/web/nginx/certs"#ZWMP- "/home/rtcms/record:/home/rtcms/record" //录像文件保存路径privileged: true
3.6启动服务器
在运行服务器根目录运行下面命令启动docker容器:
#cd /home/rtcms
#docker-compose up -d
可以通过docker ps命令查看运行中的容器,也可以通过执行容器中的show命令来查看到核心进程,正常情况下应该由7个进程,至此,服务器就启动完成了,见下:
#docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67568d2727ac zwancqcn/rtcms:2.0 "/bin/bash -c start" 46 hours ago Up 14 minutes rtcms-app#docker exec -it $(docker ps -q) su - rtcms -s /bin/bash -c "show"
rtcms 228 1 0 14:12 ? 00:00:00 zwdog
rtcms 426 1 0 14:12 ? 00:00:00 zwstart
rtcms 509 1 0 14:12 ? 00:00:00 zwcomm
rtcms 514 1 0 14:12 ? 00:00:01 rtcgw
rtcms 520 1 0 14:12 ? 00:00:01 turnserver
rtcms 526 1 0 14:12 ? 00:00:00 logserver
rtcms 532 1 13 14:12 ? 00:01:18 zwmp
如果发现进程少于7个,请使用docker stop $(docker ps -q)命令停止,检查yml配置文件,特别是license字串是否拷贝完整,在通过docker-compose来启动。
4、测试验证
rtcms是个开放的系统,所有代码将逐步开源,目前开源了客户端,用户可以下载客户端sdk进行二次开发。在前面启动的docker容器中提供了oam后台管理页面和一个测试页面,该测试页面有完善的视频会议功能。
通过chrome、firefox、edge等支持webrtc的现代浏览器,在一台带有摄像头和麦克风的电脑上访问: https://[你服务器的IP]:2337/demo即可访问到服务器oam界面,用户名和密码都填admin即可登录进oam主页面:
在左侧菜单中点击“在线demo”,可跳转到docker提供的远程协助视频会议应用界面:
用户名和密码随意输入即可登录进demo主界面:
点击创建会议,填写会议名称,选择本机的麦克风和摄像头设备,即可创建一个视频会议。注意,第一次运行浏览器会提示是否允许本网站使用麦克风和摄像头设备,请选择允许:
为了达到最佳显示效果,请选择你电脑上的摄像头的最大分辨率,通常笔记本电脑的最大分辨率是720P,外接的高清摄像头分辨率是1080P。
其它参数的解释可以参考本专栏后续文章。
点击创建会议按钮,此时你应该可以看到摄像头已经被打开,并且出现了画面了。
此画面是从服务器上传输回来。你可以使用其它pc机访问同样的服务器地址,加入你刚刚创建的房间,此时,你们应该可以开始进行视频通话了。