Recording failed to start (Jibri)


Thank you in advance.


The error looks like it’s due to an issue with some of the xmpp strings. I think it may be that the roomJid domain doesn’t contain the xmpp domain configured in Jibri’s config file?


Hello again @bbaldino

Could you please tell me what’s the “xmpp strings”? Do you think my domainname “” is incorrect strings? And what is “roomJid” ?

Thank you in advance.


The exception is coming from here which is this line:

val subdomain = domain.subSequence(0, domain.indexOf(xmppDomain)).trim('.')

I think domain.indexOf(xmppDomain) is returning -1, which is causing the exception in subSequence. domain comes from the roomJid and xmppDomain is the configured xmpp domain in your config.json (which in your case is "xmpp_domain": "****" (I assume the asterisks aren’t actually in the config file, right?). I can’t tell what your roomJid is though. It might be logged elsewhere in the logs if you want to attach them all.


Hello @bbaldino

Actually, I dont’ put asterisks in config file. The below log from jibri server is appeared when I try to start recording from jitsi-meet server (I can hear speaker said “Recording has started”) but fail to start the recording function.

Thank you in advance.

2018-08-14 10:09:40.419 INFO: [26] org.jitsi.jibri.api.xmpp.XmppApi.handleStartJibriIq() Received start request
2018-08-14 10:09:40.419 INFO: [26] org.jitsi.jibri.api.xmpp.XmppApi.handleStartJibriIq() Sending ‘pending’ response to start IQ
2018-08-14 10:09:40.419 INFO: [39] Starting service
2018-08-14 10:09:40.420 SEVERE: [39] Error in startService task: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 with stack:

2018-08-14 10:09:40.420 INFO: [39] Sending start service response iq:


@bbaldino This is my actual /etc/jitsi/jibri/config.json on jibri server. FYI.

root@ubuntu:~# cat /etc/jitsi/jibri/config.json
// NOTE: this is a SAMPLE config file, it will need to be configured with
// values from your environment

// Where recording files should be temporarily stored
// The path to the script which will be run on completed recordings
"finalize_recording_script_path": "/path/to/",
"xmpp_environments": [
        // A friendly name for this environment which can be used
        //  for logging, stats, etc.
        "name": "prod environment",
        // The hosts of the XMPP servers to connect to as part of
        //  this environment
        "xmpp_server_hosts": [
        // The xmpp domain we'll connect to on the XMPP server
        "xmpp_domain": "",
        // Jibri will login to the xmpp server as a privileged user
        "control_login": {
            // The domain to use for logging in
            "domain": "",
            // The credentials for logging in
            "username": "jibri",
            "password": "jibriauthpass"
        // Using the control_login information above, Jibri will join
        //  a control muc as a means of announcing its availability
        //  to provide services for a given environment
        "control_muc": {
            "domain": "",
            "room_name": "JibriBrewery",
            "nickname": "jibri-nickname"
        // All participants in a call join a muc so they can exchange
        //  information.  Jibri can be instructed to join a special muc
        //  with credentials to give it special abilities (e.g. not being
        //  displayed to other users like a normal participant)
        "call_login": {
            "domain": "",
            "username": "recorder",
            "password": "jibrirecorderpass"
        // When jibri gets a request to start a service for a room, the room
        //  jid will look like:
        //  roomName@optional.prefixes.subdomain.xmpp_domain
        // We'll build the url for the call by transforming that into:
        //  https://xmpp_domain/subdomain/roomName
        // So if there are any prefixes in the jid (like jitsi meet, which
        //  has its participants join a muc at conference.xmpp_domain) then
        //  list that prefix here so it can be stripped out to generate
        //  the call url correctly
        "room_jid_domain_string_to_strip_from_start": "conference.",
        // The amount of time, in minutes, a service is allowed to continue.
        //  Once a service has been running for this long, it will be
        //  stopped (cleanly).  A value of 0 means an indefinite amount
        //  of time is allowed
        "usage_timeout": "0"



Can you post your prosody config?


Hello @bbaldino

The dashbroad blocked my post now. I will try later. Or coule you please provide me your email?

Thank you.


Hello @bbaldino

I cannot post anymore about config file. Seem your dashboard blocked my post and because it take my comment as spam. Could you please give me the instruction?

Thank you in advance.


Hello @bbaldino

root@conference:~# cat /etc/prosody/conf.d/xxxxxxxxxxx.cfg.lua
– Plugins path gets uncommented during jitsi-meet-tokens package install - that’s where token plugin is located
–plugin_paths = { “/usr/share/jitsi-meet/prosody-plugins/” }

VirtualHost “xxxxxxxxxxx”
– enabled = false – Remove this line to enable this host
authentication = “anonymous”
– Properties below are modified by jitsi-meet-tokens package config
– and authentication above is switched to “token”
– Assign this host a certificate for TLS, otherwise it would use the one
– set in the global section (if any).
– Note that old-style SSL on port 5223 only supports one certificate, and will always
– use the global one.
ssl = {
key = “/etc/prosody/certs/xxxxxxxxxxx.key”;
certificate = “/etc/prosody/certs/xxxxxxxxxxx.crt”;
– we need bosh
modules_enabled = {
“ping”; – Enable mod_ping

    c2s_require_encryption = false

Component “conference.xxxxxxxxxxx” “muc”
storage = “null”
–modules_enabled = { “token_verification” }
admins = { “focus@auth.xxxxxxxxxxx” }

Component “jitsi-videobridge.xxxxxxxxxxx”
component_secret = “31L047iL”

VirtualHost “auth.xxxxxxxxxxx”
ssl = {
key = “/etc/prosody/certs/auth.xxxxxxxxxxx.key”;
certificate = “/etc/prosody/certs/auth.xxxxxxxxxxx.crt”;
authentication = “internal_plain”

Component “focus.xxxxxxxxxxx”
component_secret = “ryPaMfDD”

– jibri
Component “internal.auth.xxxxxxxxxxx” “muc”
modules_enabled = {
storage = “null”
muc_room_cache_size = 1000

VirtualHost “recorder.xxxxxxxxxxx”
modules_enabled = {
authentication = “internal_plain”


The roomJid will come from this part, but you have the domain obscured. Can you paste the entire Component “conference.xxxxxxxxxxx” “muc” line?


Hello @bbaldino

My xxxxxxxx is the same with “xmpp_server_hosts”. I cannot post it here because your dashboard blocked my domainname. However, I’ve tried to change domainname by reinstall on another machine but it doesn’t work as well. Again, Basic Jitsi-meet function always work properly but only recording function.

Thank you.


Ok, in that case it appears like it should be fine, but obviously something is up here. Did you install this Jibri from source? If so we could add some extra logging. Worst case I could probably build you a custom jar that you could swap out on your Jibri machine.


Hello @bbaldino

I installed the jitsi-meet by this way on Ubuntu 16.04 and it can properly work for basic conference function.

2  apt-get update
3  ll /var/www
4  ll /var/
5  apt-get upgrade -y
6  apt-get install apache2 -y
7  a2enmod ssl
8  a2enmod headers
9  a2enmod proxy

10 a2enmod rewrite
11 service apache2 restart
12 apt-get install php-curl -y
13 apt-get install build-essential libssl-dev -y
14 curl -sL -o
15 ll
16 bash
17 rm
18 ll
19 exit
20 cd
21 nvm ls-remote
22 nvm install 9.2.1
23 node -v
24 npm -v


@bbaldino more lines for installation.

25 apt install python2.7 python-pip -y
26 python --version
27 echo ‘deb stable/’ >> /etc/apt/sources.list.d/jitsi-stable.list
28 wget -qO - | apt-key add -
29 ll
31 apt update
32 apt upgrade -y
33 apt-get -y install jitsi-meet
51 /usr/share/jitsi-meet/scripts/