目录

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.pem

Country 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.pem

Country 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.0

starting 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-app
    image: zwancqcn/rtcms:2.0
    network_mode: "host"    
    environment:
      
      #Module type: rtcgw|zwmp|all
      Type: "all"     #单服务器固定为all
      
      #Module configuration
      ModuleID: "1"
      ModuleIP: "192.168.1.100"      #填写成此服务器私网IP地址
      ModulePort: "2339"
      License: "MzM4ZTg0MGRiZWEyMDVjNmFiYWVhYTA5OTE4MmY0YTAg"  #填写上一步获得的license
      PublicIP: "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 configuration
      RtcgwModuleID: "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 parameter
      AudioChanNum: "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 ps

CONTAINER 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机访问同样的服务器地址,加入你刚刚创建的房间,此时,你们应该可以开始进行视频通话了。

Logo

致力于链接即构和开发者,提供实时互动和元宇宙领域的前沿洞察、技术分享和丰富的开发者活动,共建实时互动世界。

更多推荐