想学更多的WebRTC知识,请关注WebRTC中文社区
前言
咱们在作视频会议系统的时候,一般都会有会议录制功能,那么做为视频会议开源的翘楚,Jitsi是怎么作这一点的,在官方文档及其隐晦的状况下,咱们该怎么成功搭建视频录制服务呢?下面我就带你们来了解下实战操做一把html
什么的Jibri
Jibri提供用于录制或流式传输Jitsi Meet会议的服务。java
它经过启动在虚拟帧缓冲区中呈现的Chrome实例并使用ffmpeg捕获和编码输出来工做。它旨在在单独的计算机(或VM)上运行,而没有其余使用显示或音频设备的应用程序。单个jibri一次仅支持一次录制。linux
这里注意 ** 单个Jibri一次仅支持一次录制** ,也就是说一个Jibri服务只能同时录制一次视频会议,若是在其余会议室录制的同时在开启录制,那么他会返回没有录制设备可用,或者设备在忙web
Jibri的设计思路
个人理解可能有误差,由于我也才刚接触2天,欢迎各位补充。 Jibri从新添加了一个隐藏用户,这个用户你是看不见的,用户没有感知,进入了会议室,它使用了Chrome Driver来控制Chrome实例,在使用ffmpeg进行捕获而后编码在输出为mp4格式的视频文件。chrome
录制的方式
服务端录制
优势是不用担忧客户因自身电脑问题形成录制失败(如磁盘空间不足),也不会因录制时抢占资源(CPU 占用率太高)而致使其余应用出现问题等;缺点是实现的复杂度很高。docker
客户端录制:
优势是方便录制方操控,而且所录制的视频清晰度高,实现相对简单。这里能够和服务端录制作个对比,通常客户端摄像头的分辨率都很是高的(如 1280x720),因此客户端录制能够录制出很是清晰的视频;但服务端录制要作到这点就很困难了,本地高清的视频在上传服务端时因为网络带宽不足,视频的分辨率颇有可能会被自动缩小到了 640x360,这就致使用户回看时视频特别模糊,用户体验差。不过客户端录制也有缺点,其中最主要的缺点就是耗 CPU。而 CPU 占用太高后,就很容易形成应用程序卡死。除此以外,它对内存、硬盘的要求也特别高,不过在计算机硬件发展的今天,这已经不是什么大问题了shell
准备工做:
- 官方文档用Ubuntu16.04进行的安装,我测试的时候用的是Ubuntu18.04进行安装,二选其一便可。
- 已经搭建好jitsi-meet,并能正常的视频通话,若是没有搭建Jitsi-meet,能够按章个人上篇文章进行搭建
安装依赖:
apt install linux-image-extra-virtual ffmpeg curl unzip software-properties-common
由于安装了linux-image-extra-virtual 内核软件包,为了让他生效,咱们须要从新启动操做系统,注意 如下命令会让你电脑进行重启启动json
reboot
重启电脑后,从新ssh进入云主机vim
加载snd-aloop模块:
设置要在启动时加载的模块:api
echo "snd-aloop" >> /etc/modules
将模块加载到正在运行的内核中:
modprobe snd-aloop
检查模块是否已加载:
lsmod | grep snd_aloop
输出如下内容即是成功加载了
root@jvb:~# lsmod | grep snd_aloop snd_aloop 24576 0 snd_pcm 98304 1 snd_aloop snd 81920 3 snd_timer,snd_aloop,snd_pcm
安装Google Chrome:
curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list apt-get -y update apt-get -y install google-chrome-stable
安装ChromeDriver,他是用来控制Chrome:
CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ unzip ~/chromedriver_linux64.zip -d ~/ rm ~/chromedriver_linux64.zip sudo mv -f ~/chromedriver /usr/local/bin/chromedriver sudo chown root:root /usr/local/bin/chromedriver sudo chmod 0755 /usr/local/bin/chromedriver
安装Jibri:
wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add - sudo sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list" sudo apt-get update sudo apt-get install jibri
在执行sudo apt-get install jibri
若是提示让你选择,选择keyboard configuration,并选择英文English,若是没有提示请忽略。
将Jibri的用户账户添加到用户组:
usermod -aG adm,audio,video,plugdev jibri
配置Prosody
注意
- 如下的jitsi.example.com所有替换成你的域名
- 个人jitsi-meet在一台服务器,Jibri在另外一台服务器。当我以为安装在一台服务器也没有问题。
vim /etc/prosody/conf.d/you config.cfg.lua
若是有下面内容的,请忽略,没有的请添加
---Set up a MUC (multi-user chat) room server on conference.example.com: Component "conference.jitsi.example.com" "muc" --- Store MUC messages in an archive and allow users to access it modules_enabled = { "muc_mam" }
添加internal MUC 组件
--- internal muc component, meant to enable pools of jibri and jigasi clients Component "internal.auth.jitsi.example.com" "muc" modules_enabled = { "ping"; } storage = "internal" muc_room_cache_size = 1000
添加VirtualHost以保存jibri用户
VirtualHost "recorder.jitsi.example.com" modules_enabled = { "ping"; } authentication = "internal_plain"
为Jibri建立两个新账户,一个用于控制,一个用于记录:
prosodyctl register jibri auth.jitsi.example.com Jibripssword prosodyctl register recorder recorder.jitsi.example.com recorderPssword
配置Jicofo:
vim /etc/jitsi/jicofo/sip-communicator.properties org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.yourdomain.com org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90
配置Jitsi Meet:
配置Jitsi Meet 让录制按钮在界面中显示出来
vim /etc/jitsi/meet/jitsi.example.com-config.js 找到如下配置取消注释 fileRecordingsEnabled: true, // 启用文件录制 liveStreamingEnabled: true, // 启用实时流媒体录制,这个选项是能够直接推流到油管进行直播的 hiddenDomain: 'recorder.yourdomain.com', //隐藏域
还能够直接将录制文件保存到云存储,不过目前就支持dropbox
// dropbox: { // appKey: 'you app key', // Specify your app key here. // // A URL to redirect the user to, after authenticating // // by default uses: // redirectURI: 'https://jitsi.example.com/static/oauth.html' //` },
在建立dropbox应用的时候OAuth 2的Redirect URIs直接写
'https://jitsi.example.com/static/oauth.htm
这样配置才会生效
创建目录来存储录音并设置其权限:
mkdir srv/recordings chown jibri:jibri srv/recordings
配置Jibri:
vim /etc/jitsi/jibri/config.json
"recording_directory": "srv/recordings", / /录制文件 "finalize_recording_script_path": "", //录制完成后启动的shell脚本,官方这里写了一串路径,可是我没有找到他,因此直接取消了 //刚刚上面配置Prosody的配置 "xmpp_server_hosts": [ "jitsi.example.com" ], "xmpp_domain": "jitsi.example.com", "control_login": { "domain": "auth.jitsi.example.com", "username": "jibri", "password": "Jibr1P@ssw0rd" }, // 注意,若是要配置多个Jibri,同时录制多个房间,这里的用户名不能一致 "control_muc": { "domain": "internal.auth.jitsi.example.com", "room_name": "JibriBrewery", "nickname": "jibri" }, "call_login": { "domain": "recorder.jitsi.example.com", "username": "recorder", "password": "Rec0rderP@ssw0rd" },
重启服务
systemctl restart prosody systemctl restart jicofo systemctl restart jitsi-videobridge2 systemctl restart jibri
开始录制
打开你的域名进入房间,点击右下角
当听到语音开始录制就表明成功了,咱们去看看咱们以前创建保存录像的文件夹
cd srv/recordings 会自动建立一个字母的文件夹 咱们进入文件夹就能够看到mp4文件夹了,你不取消录制这个视频大小会一直变化 ll 22_2020-07-16-23-15-21.mp4 视频文件名的格式是 房间名_当前时间
中止录制
当开始录制的人点击中止录制按钮后会中止录制 当全部人离开房间后会中止录制。
可选项
若是云主机没有Java8环境须要安装Java8
wget -O - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add - add-apt-repository https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ apt update apt install adoptopenjdk-8-hotspot
若是云主机有多个Java环境须要指定Java8运行Jirbri 将Java单词替换为Java8的完整路径
vim /opt/jitsi/jibri/launch.sh
替换后以下
exec /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/java -Djava.util.logging.config.file=/etc/jitsi/jibri/logging.properties -jar /opt/jitsi/jibri/jibri.jar --config "/etc/jitsi/jibri/config.json"
替换后重启
systemctl restart jibri
取消视频录制警告
当咱们把录制的视频拷贝到本地来用播放器播放后,咱们会发现视频上方有一个警告 如图:
这是chrome提出的警告,解决警告的方法以下:
mkdir -p /etc/opt/chrome/policies/managed echo '{ "CommandLineFlagSecurityWarningsEnabled": false }' >>/etc/opt/chrome/policies/managed/managed_policies.json
重启jibri
systemctl restart jibri
再次录制就没有了。
为每一个房间都录制视频
显然同时一个房间只能录制一个视频,是知足不了咱们业务需求的,可是Jibri又是经过虚拟机进行录制,每个虚拟机只能安装一个jibri,那么意味着,咱们同时录制上百个会议,那么就有上百台服务器在同时工做,服务器成本将会是个巨大的数字。
官方的社区和论坛并无提供相关的完整解决方案,只是说能够建立一个Jibri池,相似于链接池的概念,我却是以为也许容器化docker是个不错的选择。
或则使用客户端进行录制。
- [ ] 一台服务器安装多个jibri同时进行多个视频录制
后续
若是你在安装中遇到了问题能够查看日志,根据错误进行解决
tail -f /var/log/jitsi/jibri
若是你对一台服务器设置多个Jibri有不一样的想法,也欢迎你加入讨论。