1. 程式人生 > 實用技巧 >使用Jibri進行Jitsi Meet視訊錄製

使用Jibri進行Jitsi Meet視訊錄製

我們在做視訊會議系統的時候,通常都會有會議錄製功能,那麼作為視訊會議開源的翹楚,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://www.javachenglei.com 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 www.jintianxuesha.com= "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', //www.yuanmenyul.cn Specify your app key here.
    //     // A URL to redirect the user to, after authenticating
    //     // by default uses:
    //     redirectURI: 'https://www.wanfeigw.cn 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":www.chuancenpt.com "srv/recordings", / /錄製檔案 
"finalize_recording_script_path": "", //錄製完成後啟動的shell指令碼,官方這裡寫了一串路徑,但是我沒有找到他,所以直接取消了

//剛剛上面配置Prosody的配置
"xmpp_server_hosts":www.jujinyule.com [
"jitsi.example.com"
],
"xmpp_domain": "jitsi.example.com",
"control_login": www.yuntianyul.com{
"domain": "auth.jitsi.example.com",
"username": "jibri",
"password": "Jibr1P@ssw0rd"
},
// 注意,如果要配置多個Jibri,同時錄製多個房間,這裡的使用者名稱不能一致
"control_muc": {
"domain": "internal.auth.jitsi.example.com",
"room_name": "JibriBrewery",
"nickname": www.jintianxuesha.com"jibri"
},
"call_login"www.tengyao3zc.cn: {
"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