10分钟快速搭建多方视频会议系统

目录

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

【内容描述】 全套视频会议平台,并包含类似qq的点对点即时通讯系统,视频语音,电子白板,远程控制等强大功能。可提供全部源代码。详细功能描述如下: 视频会议特性:多点输入输出,每个客户端最大可支持4通道输入(音视频同步)。每个输入通道可以被其他客户端选择性的接收。每个客户端最大可支持4个屏幕输出,可以将多个输出屏幕组合成电视墙来使用。视频会议系统同即时通讯系统高度集成。通过即时通讯系统,可以很方便的邀请好友加入到视频会议中。 云台支持:支持各类主流云台,可以远程控制云台运动。 虚拟会议中心:单个服务器支持多个虚拟视频会议。所有的会议都可以进行,彼此之间相互独立互不干扰。 会议模式和权限控制:视频会议系统拥有多种会议模式和多级权限控制,使得会议控制更加安全可靠。参加会议的用户有三种身份:主持人、与会者和旁听者。主持人拥有全部的操作权限,同时负责会议的管理工作。与会者拥有指定操作的权限,该指定权限可以预先设置,也可以由主持人随时动态调整。旁听者没有任何操作权限。与会者可以请求发言,一旦成为发言者,该与会者即拥有全部的操作权限。会议模式包含自由发言模式和受控模式。在受控模式下,与会者的发言请求需要主持人的批准;在自由发言模式下,与会者的发言请求不需要主持人的批准而立刻被允许。会议允许多个用户拥有主持人身份,他们可以同时协同操作,使得会议的管理工作更加容易。 高质量的视音频,系统支持多种类型的视频和音频输入。视频输入设备支持标准的Windows摄像头和专业的视频采集卡。系统支持多种视频大小和编码方式。视频尺寸支持从160X120到720X576。视频编码支持XVID和H264。系统支持多种音频编码方式,最高音质可与CD相媲美。音频和视频参数可以随时动态调整。主持人用户还可以远程调整其他用户的视音频参数,以帮助对系统不熟悉的用户。屏幕和应用程序共享实时共享文件、图片、网页、多媒体文件甚至整个桌面。轻松解决了会议中不同用户身处不同的地方的合作性困难,大大增强了视频会议系统的可用性,并确保其达到最佳的交互效果。 电子白板*使用矢量位图的格式,您可以保存、导入、粘贴位图或文本文件。提供多种的二维绘图模型:线、矩形、三角形、圆形、椭圆等,提供多种三维模型:圆锥、圆柱及立方体等。仅仅通过鼠标操作,你就可以任意缩放、旋转其中的任何图形模型。白板操作即时被传送到所有会议用户,所有会议用户的白板将同步显示相同内容。系统支持电子白板的录制和回放。 会议字幕*会议字幕将在所有会议用户的屏幕下方滚动显示。 文字聊天*系统支持所有会议用户之间的文字聊天。*系统支持两个会议用户之间私下的文字聊天,不会对会议其他用户产生干扰。 丰富的显示模板*系统支持多种显示模板选择。*系统图像支持任意拖放。*系统独有画中画显示功能,可以重点突出被选择的视频图像。 录像和回放*系统支持将会议的全部音频、视频以及数据操作录制在一个文件中,回放的时候可以真实再现当时会议场景。*系统支持在会议中回放预先录制的文件。 高效的传输算法*通过独立自主研发的传输算法,系统可以适应从56K拨号上网到光纤等各类IP网络。传输以保证实时性为最高目标,在保证实时性的前提下尽量获取最大传输带宽,这样可以最大程度的保障会议的效果。良好的扩展性*为满足大系统的容量要求,视频会议支持多MCU级联实现。 即时通讯主要特性: 音视频*可以根据网络带宽情况调整音视频参数,以获得最佳效果。*可以远程调整其他用户的视音频参数,以帮助对系统不熟悉的用户。 电子白板*使用矢量位图的格式,您可以保存、导入、粘贴位图或文本文件。提供多种的二维绘图模型:线、矩形、三角形、圆形、椭圆等,提供多种三维模型:圆锥、圆柱及立方体等。仅仅通过鼠标操作,你就可以任意缩放、旋转其中的任何图形模型。白板操作即时被传送到所有会议用户,所有会议用户的白板将同步显示相同内容。系统支持电子白板的录制和回放。多方视频*你可以邀请多个用户加入到同一个视频对话中来组建一个快速的小型视频会议。屏幕和应用程序共享*实时共享文件、图片、网页、多媒体文件甚至整个桌面。轻松解决了会议中不同用户身处不同的地方的合作性困难。文件传输*你可以传输任何文件至任意用户。 网络文件柜*你可以上传文件至服务器并且可以被授权用户下载。发布公告*你可以对你所属部门的全体用户发布公告通知。与视频会议相集成*与视频会议系统相集成。通过即时通讯系统,你可以邀请其他用户加入到视频会议中来。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值