zoukankan      html  css  js  c++  java
  • 使用Jibri进行Jitsi Meet视频录制

    想学更多的WebRTC知识,请关注WebRTC中文社区

    前言

    我们在做视频会议系统的时候,通常都会有会议录制功能,那么作为视频会议开源的翘楚,Jitsi是怎么做这一点的,在官方文档及其隐晦的情况下,我们该怎么成功搭建视频录制服务呢?下面我就带大家来了解下实战操作一把

    什么的Jibri

    Jibri提供用于录制或流式传输Jitsi Meet会议的服务。

    它通过启动在虚拟帧缓冲区中呈现的Chrome实例并使用ffmpeg捕获和编码输出来工作。它旨在在单独的计算机(或VM)上运行,而没有其他使用显示或音频设备的应用程序。单个jibri一次仅支持一次录制。

    这里注意 ** 单个Jibri一次仅支持一次录制** ,也就是说一个Jibri服务只能同时录制一次视频会议,如果在其他会议室录制的同时在开启录制,那么他会返回没有录制设备可用,或者设备在忙

    Jibri的设计思路

    我的理解可能有偏差,因为我也才刚接触2天,欢迎各位补充。 Jibri重新添加了一个隐藏用户,这个用户你是看不见的,用户没有感知,进入了会议室,它使用了Chrome Driver来控制Chrome实例,在使用ffmpeg进行捕获然后编码在输出为mp4格式的视频文件。

    录制的方式

    服务端录制

    优点是不用担心客户因自身电脑问题造成录制失败(如磁盘空间不足),也不会因录制时抢占资源(CPU 占用率过高)而导致其他应用出现问题等;缺点是实现的复杂度很高。

    客户端录制:

    优点是方便录制方操控,并且所录制的视频清晰度高,实现相对简单。这里可以和服务端录制做个对比,一般客户端摄像头的分辨率都非常高的(如 1280x720),所以客户端录制可以录制出非常清晰的视频;但服务端录制要做到这点就很困难了,本地高清的视频在上传服务端时由于网络带宽不足,视频的分辨率很有可能会被自动缩小到了 640x360,这就导致用户回看时视频特别模糊,用户体验差。不过客户端录制也有缺点,其中最主要的缺点就是耗 CPU。而 CPU 占用过高后,就很容易造成应用程序卡死。除此之外,它对内存、硬盘的要求也特别高,不过在计算机硬件发展的今天,这已经不是什么大问题了

    准备工作:

    • 官方文档用Ubuntu16.04进行的安装,我测试的时候用的是Ubuntu18.04进行安装,二选其一即可。
    • 已经搭建好jitsi-meet,并能正常的视频通话,如果没有搭建Jitsi-meet,可以按章我的上篇文章进行搭建

    安装依赖:

    apt install linux-image-extra-virtual ffmpeg curl unzip software-properties-common
    

    因为安装了linux-image-extra-virtual 内核软件包,为了让他生效,我们需要重新启动操作系统,注意 以下命令会让你电脑进行重启启动

    reboot
    

    重启电脑后,重新ssh进入云主机

    加载snd-aloop模块:

    设置要在启动时加载的模块:

    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
    学习时的痛苦是暂时的 未学到的痛苦是终生的
  • 相关阅读:
    gitignore 过滤文件
    lua语言入门之Sublime Text设置lua的Build System
    进程间通信
    临界区 事件 互斥对象等多线程编程基础
    Delphi通过Map文件查找内存地址出错代码所在行
    Delphi/C++ Builder Map文件格式解析
    深入理解计算机系统----读书笔记
    TCP/IP——内网IP
    Python——import与reload模块的区别
    Linux——grep binary file
  • 原文地址:https://www.cnblogs.com/grimm/p/14785420.html
Copyright © 2011-2022 走看看