想學更多的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有不一樣的想法,也歡迎你加入討論。