Jibri (Recording & Streaming for Jitsi)

  • 2,949 views. Added .

Want to enable recording and streaming on your Jitsi Meet server? Join me as I walk through the complete setup of Jibri!

All of the commands and configuration I used in this video are available in text form here: https://nerdonthestreet.com/wiki?find=Set+Up+Jibri+for+Jitsi+Recording%3Aslash%3AStreaming

Comments (log in to post)

I have jibri install on my jitisi meet server but haveing issues with live streams

thats from my browser log file.

2020-08-30 13:20:28.012 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [INFO] Done waiting for pending navigations. Status: ok

2020-08-30 13:20:28.012 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [FINE] DevTools WebSocket Command: Runtime.evaluate (id=240) 35973CC5419AB588D8B827B710AA92D3 {
   "awaitPromise": true,
   "expression": "(function() { // Copyright © 2012 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/**\n * Enum f…",
   "returnByValue": true
}

2020-08-30 13:20:28.012 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [FINE] DevTools WebSocket Response: Runtime.evaluate (id=240) 35973CC5419AB588D8B827B710AA92D3 {
   "result": {
      "type": "object",
      "value": {
         "status": 0,
         "value": null
      }
   }
}

2020-08-30 13:20:28.012 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [INFO] Waiting for pending navigations…

2020-08-30 13:20:28.012 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [FINE] DevTools WebSocket Command: Runtime.evaluate (id=241) 35973CC5419AB588D8B827B710AA92D3 {
   "expression": "1"
}

2020-08-30 13:20:28.012 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [FINE] DevTools WebSocket Response: Runtime.evaluate (id=241) 35973CC5419AB588D8B827B710AA92D3 {
   "result": {
      "description": "1",
      "type": "number",
      "value": 1
   }
}

2020-08-30 13:20:28.013 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [INFO] Done waiting for pending navigations. Status: ok

2020-08-30 13:20:28.013 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [INFO] [d907c5ed5abb4085b7637b923679615e] RESPONSE ExecuteScript null

2020-08-30 13:20:28.013 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [INFO] [d907c5ed5abb4085b7637b923679615e] COMMAND GetLogTypes {

}

2020-08-30 13:20:28.013 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [INFO] [d907c5ed5abb4085b7637b923679615e] RESPONSE GetLogTypes [ "browser", "driver" ]

2020-08-30 13:20:28.013 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [INFO] [d907c5ed5abb4085b7637b923679615e] COMMAND GetLog {
   "type": "browser"
}

2020-08-30 13:20:28.013 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [FINE] DevTools WebSocket Command: Runtime.evaluate (id=242) 35973CC5419AB588D8B827B710AA92D3 {
   "awaitPromise": false,
   "expression": "1",
   "returnByValue": true
}

2020-08-30 13:20:28.013 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [FINE] DevTools WebSocket Response: Runtime.evaluate (id=242) 35973CC5419AB588D8B827B710AA92D3 {
   "result": {
      "description": "1",
      "type": "number",
      "value": 1
   }
}

2020-08-30 13:20:28.013 INFO: [360] browser.leaveCallAndQuitBrowser() [2020-08-30T13:20:27+0000] [INFO] [d907c5ed5abb4085b7637b923679615e] RESPONSE GetLog [ {
   "level": "WARNING",
   "message": "https://meet.mogokdhamma.co.uk/libs/app.bundle.min.js?v=4289 71:36233 "2020-08-30T13:19:55.672Z" "[modules/UI/videolayout/VideoLayout.js]" "\u003CObject.changeUserAvatar>: " "Missed avatar update -…",
   "source": "console-api",
   "timestamp": 1.598793595674e+12
}, {
   "level": "WARNING",
   "message": "https://meet.mogokdhamma.co.uk/libs/lib-jitsi-meet.min.js?v=4289 9:26473 "2020-08-30T13:19:55.767Z" "[modules/statistics/AnalyticsAdapter.js]" "\u003CObject.dispose>: " "Disposing of analytics adap…",
   "source": "console-api",
   "timestamp": 1.598793595771e+12
}, {
   "level": "WARNING",
   "message": "https://meet.mogokdhamma.co.uk/libs/app.bundle.min.js?v=4289 71:36233 "2020-08-30T13:19:56.630Z" "[modules/UI/videolayout/VideoLayout.js]" "\u003CObject.changeUserAvatar>: " "Missed avatar update -…",
   "source": "console-api",
   "timestamp": 1.598793596632e+12
}, {
   "level": "WARNING",
   "message": "https://meet.mogokdhamma.co.uk/libs/lib-jitsi-meet.min.js?v=4289 9:26473 "2020-08-30T13:19:56.641Z" "[JitsiMeetJS.js]" "\u003CObject.init>: " "Analytics disabled, disposing."",
   "source": "console-api",
   "timestamp": 1.598793596642e+12
}, {
   "level": "WARNING",
   "message": "https://meet.mogokdhamma.co.uk/libs/lib-jitsi-meet.min.js?v=4289 9:26473 "2020-08-30T13:19:56.642Z" "[modules/statistics/AnalyticsAdapter.js]" "\u003CObject.dispose>: " "Disposing of analytics adap…",
   "source": "console-api",
   "timestamp": 1.598793596644e+12
}, {
   "level": "SEVERE",
   "message": "https://meet.mogokdhamma.co.uk/libs/lib-jitsi-meet.min.js?v=4289 9:26473 "2020-08-30T13:19:57.163Z" "[JitsiMeetJS.js]" "\u003CObject.getGlobalOnErrorHandler>: " "UnhandledError: null" "Script: null…",
   "source": "console-api",
   "timestamp": 1.598793597516e+12
}, {
   "level": "SEVERE",
   "message": "https://meet.mogokdhamma.co.uk/libs/lib-jitsi-meet.min.js?v=4289 9:26473 "2020-08-30T13:19:57.166Z" "[modules/xmpp/strophe.util.js]" "\u003CObject.r.Strophe.log>: " "Strophe: BOSH-Connection failed…",
   "source": "console-api",
   "timestamp": 1.598793597516e+12
}, {
   "level": "SEVERE",
   "message": "https://meet.mogokdhamma.co.uk/libs/app.bundle.min.js?v=4289 71:36233 "2020-08-30T13:19:57.172Z" "[connection.js]" "\u003Ca.o>: " "CONNECTION FAILED:" "connection.otherError"",
   "source": "console-api",
   "timestamp": 1.598793597516e+12
}, {
   "level": "SEVERE",
   "message": "https://meet.mogokdhamma.co.uk/libs/app.bundle.min.js?v=4289 71:36233 "2020-08-30T13:19:57.185Z" "[features/base/connection]" "connection.otherError"",
   "source": "console-api",
   "timestamp": 1.598793597517e+12
}, {
   "level": "WARNING",
   "message": "https://meet.mogokdhamma.co.uk/libs/lib-jitsi-meet.min.js?v=4289 9:26473 "2020-08-30T13:19:57.277Z" "[modules/RTC/RTCUtils.js]" "Failed to get access to local media.  NotReadableError: Could not st…",
   "source": "console-api",
   "timestamp": 1.598793597517e+12
}, {
   "level": "SEVERE",

EduardoF said

Good morning, I just made the configuration following the instructions of the video but I have a problem, I cannot start the recording. The error it gives me is the following:

2020-08-10 09:33:22.017 GRAVE: [8756] org.jitsi.jibri.selenium.JibriSelenium.run() An error occurred while joining the call: org.openqa.selenium.WebDriverException: <unknown>: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.
  (Session info: chrome=84.0.4147.105)
  (Driver info: chromedriver=84.0.4147.30 (48b3e868b4cc0aa7e8149519690b6f6949e110a8-refs/branch-heads/4147@{#310}),platform=Linux 4.19.0-8-amd64 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
System info: host: 'meettest', ip: '127.0.0.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.19.0-8-amd64', java.version: '1.8.0_265'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 84.0.4147.30 (48b3e868b4cc0…, userDataDir: /tmp/.com.google.Chrome.7Vb87L}, cssSelectorsEnabled: true, databaseEnabled: false, goog:chromeOptions: {debuggerAddress: localhost:44219}, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), rotatable: false, setWindowRect: true, strictFileInteractability: false, takesHeapSnapshot: true, takesScreenshot: true, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unexpectedAlertBehaviour: ignore, unhandledPromptBehavior; ignore, version: 84.0.4147.105, webStorageEnabled: true, webauthn:virtualAuthenticators: true}
Session ID: 7c93dab70d796709dc6c142f5555a78a with stack:
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:423)
org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)
org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)
org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:543)
org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:480)
org.jitsi.jibri.selenium.JibriSelenium.setLocalStorageValues(JibriSelenium.kt:178)
org.jitsi.jibri.selenium.JibriSelenium.access$setLocalStorageValues(JibriSelenium.kt:116)
org.jitsi.jibri.selenium.JibriSelenium$joinCall$1.run(JibriSelenium.kt:258)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
java.lang.Thread.run(Thread.java:748)
Any idea how to fix it?



Good morning, I just made the configuration following the instructions of the video but I have a problem, I cannot start the recording. The error it gives me is the following:

2020-08-06 11:56:10.673 INFORMACIÓN: [54] org.jitsi.jibri.selenium.JibriSelenium.onSeleniumStateChange() Transitioning from state Starting up to Error: FailedToJoinCall
SESSION Failed to join the call
2020-08-06 11:56:10.675 INFORMACIÓN: [54] org.jitsi.jibri.service.impl.FileRecordingJibriService.onServiceStateChange() File recording service transitioning from state S
tarting up to Error: FailedToJoinCall SESSION Failed to join the call
2020-08-06 11:56:10.677 INFORMACIÓN: [54] org.jitsi.jibri.api.xmpp.XmppApi.invoke() Current service had an error Error: FailedToJoinCall SESSION Failed to join the call,
 sending error iq <iq to='jibribrewery@internal.auth.meettest.colonizacion.com.uy/focus' id='043eM-36' type='set'><jibri xmlns='http://jitsi.org/protocol/jibri' status='
off' failure_reason='error' should_retry='true'/></iq>

Any idea how to fix it?

You are the man!

We setup Jitsi on blank server through a hosting company, and I am in no way qualified to be working with a server like Jibri requires…

… got Jibri set up for my superiors first try with your help!

Awesome background information as well!
Thank you for the wonderful job you did on this.

My recording fails and I found when I check on the status of jibri via systemctl i get this.

● jibri.service - Jibri Process
   Loaded: loaded (/etc/systemd/system/jibri.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-06-25 15:18:51 EDT; 12min ago
 Main PID: 432 (java)
    Tasks: 33 (limit: 19183)
   Memory: 218.7M
   CGroup: /system.slice/jibri.service
           └─432 /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

Jun 25 15:18:51 jibri systemd[1]: Started Jibri Process.
Jun 25 15:18:55 jibri launch.sh[432]: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
Jun 25 15:18:55 jibri launch.sh[432]: SLF4J: Defaulting to no-operation (NOP) logger implementation
Jun 25 15:18:55 jibri launch.sh[432]: SLF4J: See SLF4J Error Codes for further details.
Hi there! That output is normal, and does not show what the issue is. (The process is "active (running)" which means that service has not crashed.) You'll need to check your logs in /var/log to know why the recording is failing.
Hi
I couldn't see any option for editing a previous post I posted.

This is the kernel I have on my Digitalocean Jitsi Droplet
Linux jitsimeet 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
will it work with your instructions?
Thnaks
Wow
What a great job you've done!!!
The recording and streaming now appears in my jitsi settings
Unfrotunately the recording doesn't actually work.
Is there a way for troubleshooting?
Thnaks
I had to create an account to comment. thanks for sharing it :)

Jibri itself guide is not complete as you said on video, but you helped me a lot with some tips, specially java 8 and chrome policie.

By the way on you guide the policie is not written

Im running it on 2 ubuntu 18.04 servers, jibri alone and jitsi environment on another server but for some reason my "recorder" is joining the rooms ! In the community i didnt find directions, any idea what could be?
The hidden settings is ok, no effect :|