Jibri - unknown error: Chrome failed to start: crashed

I am using self-hosted in Oracle Linux 8.4
My Jitsi-Meet, JVB, Jicofo, Coturn all running fine, and currently I am having issue on the Jibri and no idea how to further troubleshoot.

Jibri - taken master branch from github as at 2022-01-25.

Problem:
When I clicked on the Start recording button, after some seconds, around 5 seconds and the Jitsi-Meet shows error in the browser on failed recording.

Investigation Taken:
I check at my Jibri log (see below for my Jibri log) and found that Selenium reported error on Chrome failed and crashed.
At first I thought may be is my problem on the version mismatch on Google Chrome and Chrome Driver.
I checked and both are same.

# google-chrome --version
Google Chrome 97.0.4692.99

# chromedriver --version
ChromeDriver 97.0.4692.71 (adefa7837d02a07a604c1e6eff0b3a09422ab88d-refs/branch-heads/4692@{#1247})

Then next I further investigate using python to trigger the chromedriver using Selenium and it works fine.

# cat test-selenium.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

CHROMEDRIVER_PATH = '/usr/bin/chromedriver'
WINDOW_SIZE = "1920,1080"

chrome_options = Options()
chrome_options.add_argument("--window-size=%s" % WINDOW_SIZE)
chrome_options.add_argument('--no-sandbox')

driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH,
                          chrome_options=chrome_options
                         )
driver.get("https://www.google.com")
print(driver.title)
driver.close()

# python test-selenium.py
Google

Any suggestion for me to further check what probably my mistake for me to look into ?
My current Java version.

# java -version
openjdk version "11.0.9.1" 2020-11-04 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.9.1+1-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.9.1+1-LTS, mixed mode)
jibri01 2022-01-25 14:39:47.913 FINEST: [50] sun.net.www.http.HttpClient.logFinest: KeepAlive stream used: http://localhost:27466/status
jibri01 2022-01-25 14:39:47.918 FINE: [50] sun.net.www.protocol.http.HttpURLConnection.getInputStream0: sun.net.www.MessageHeader@34f9b0504 pairs: {null: HTTP/1.1 200 OK}{Content-Length: 264}{Content-Type: application/json; charset=utf-8}{cache-control: no-cache}
jibri01 2022-01-25 14:39:51.604 SEVERE: [48] XmppApi.handleStartJibriIq#226: Error starting Jibri service
org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: crashed.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
  (Driver info: chromedriver=97.0.4692.71 (adefa7837d02a07a604c1e6eff0b3a09422ab88d-refs/branch-heads/4692@{#1247}),platform=Linux 5.4.17-2102.201.3.el8uek.x86_64 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 3.05 seconds
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
System info: host: 'jitsi', ip: '192.168.83.228', os.name: 'Linux', os.arch: 'amd64', os.version: '5.4.17-2102.201.3.el8uek.x86_64', java.version: '11.0.9.1'
Driver info: driver.version: ChromeDriver
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

Share your jibri.conf

@Freddie, thanks your for quick check, here is the jibri.conf

jibri {
  id = "jibri01"
  single-use-mode = false

  api {
    http {
      external-api-port = 2222
      internal-api-port = 3333
    }

    xmpp {
      environments = [{
        name = "prod-environment"
        xmpp-server-hosts = ["xmpp.jitsi.example.com"]
        xmpp-domain = "xmpp.jitsi.example.com"

        control-muc {
          domain = "internal-auth.xmpp.jitsi.example.com"
          room-name = "JibriBrewery"
          nickname = "jibri01"
        }

        control-login {
          domain = "auth.jitsi.example.com"
          username = "jibri01"
          password = "Admin123"
        }

        call-login {
          domain = "recorder.xmpp.jitsi.example.com"
          username = "recorderjibri01"
          password = "Admin123"
        }

        strip-from-room-domain = "conference."
        usage-timeout = 0
        trust-all-xmpp-certs = true
      }]
    }
  }

  recording {
    recordings-directory = "/appl/recordings"
    finalize-script = "/usr/bin/echo finalizing jibri01"
  }

  streaming {
    rtmp-allow-list = [
      ".*"
    ]
  }

  chrome {
    flags = [
      "--use-fake-ui-for-media-stream",
      "--start-maximized",
      "--kiosk",
      "--enabled",
      "--autoplay-policy=no-user-gesture-required",
      "--alsa-output-device=jibri01"
    ]
  }

  stats {
    enable-stats-d = true
  }

  webhook {
    subscribers = []
  }

  jwt-info {
    # signing-key-path = "/path/to/key.pem"
    # kid = "key-id"
    # issuer = "issuer"
    # audience = "audience"
    # ttl = 1 hour
  }

  call-status-checks {
    no-media-timeout = 30 seconds
    all-muted-timeout = 10 minutes
    default-call-empty-timeout = 30 seconds
  }

  ffmpeg {
    resolution = "1920x1080"
    audio-source = "alsa"
    audio-device = "plug:jibri01snoop"
    display = "2"
  }
}

@Freddie , I think I found my own problem.
Is because the x11 display, which I am running on DISPLAY=:2
So, after I change at the source code

jibri-master/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/Commands.kt

"-i", ":0.0+0,0"

to

"-i", ":2.0+0,0"

and jibri-master/src/main/kotlin/org/jitsi/jibri/selenium/JibriSelenium.kt

val display: String = ":0",

to

val display: String = ":2",

then, now it no more reporting the error on Selenium.

By the way, would like to ask, is it possible for Jibri core to make configurable for DISPLAY in either environment variable or jibri.conf ?

may be somethings like these for jibri-master/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/Commands.kt

"-i", config("jibri.ffmpeg.display".from(Config.configSource))

and for jibri-master/src/main/kotlin/org/jitsi/jibri/selenium/JibriSelenium.kt

val display: String by config("jibri.selenium.display".from(Config.configSource))
1 Like

Does recording work fine now?

I suppose it is possible to make the display choice configurable, but that will need to be addressed to the Team. You can of course create a PR and see if they’ll accept it.

Still not working, problem with the alsa sound loopback device now.
Still figuring out :sweat_smile:

jibri01 2022-01-25 17:40:14.948 INFO: [57] [session_id=mcmrfdbvqqyzzcrm] EmptyCallStatusCheck.<init>#26: Starting empty call check with a timeout of PT30S
jibri01 2022-01-25 17:40:15.084 INFO: [57] [session_id=mcmrfdbvqqyzzcrm] JibriSelenium.onSeleniumStateChange#215: Transitioning from state Starting up to Running
jibri01 2022-01-25 17:40:15.085 INFO: [57] [session_id=mcmrfdbvqqyzzcrm] FileRecordingJibriService$start$1.invoke#167: Selenium joined the call, starting the capturer
jibri01 2022-01-25 17:40:15.314 INFO: [57] [session_id=mcmrfdbvqqyzzcrm] JibriSubprocess.launch#42: Starting ffmpeg with command ffmpeg -y -v info -f x11grab -draw_mouse 0 -r 30 -s 1920x1080 -thread_queue_size 4096 -i :2.0+0,0 -f alsa -thread_queue_size 4096 -i plug:jibri01snoop -acodec aac -strict -2 -ar 44100 -b:a 128k -af aresample=async=1 -c:v libx264 -preset veryfast -profile:v main -level 3.1 -pix_fmt yuv420p -r 30 -crf 25 -g 60 -tune zerolatency -f mp4 /appl/recordings/mcmrfdbvqqyzzcrm/testwithudpportblocked_2022-01-25-17-40-10.mp4 ([ffmpeg, -y, -v, info, -f, x11grab, -draw_mouse, 0, -r, 30, -s, 1920x1080, -thread_queue_size, 4096, -i, :2.0+0,0, -f, alsa, -thread_queue_size, 4096, -i, plug:jibri01snoop, -acodec, aac, -strict, -2, -ar, 44100, -b:a, 128k, -af, aresample=async=1, -c:v, libx264, -preset, veryfast, -profile:v, main, -level, 3.1, -pix_fmt, yuv420p, -r, 30, -crf, 25, -g, 60, -tune, zerolatency, -f, mp4, /appl/recordings/mcmrfdbvqqyzzcrm/testwithudpportblocked_2022-01-25-17-40-10.mp4])
jibri01 2022-01-25 17:40:20.372 INFO: [61] [session_id=mcmrfdbvqqyzzcrm] FfmpegCapturer.onFfmpegProcessUpdate#121: Ffmpeg quit abruptly.  Last output line: plug:jibri01snoop: Input/output error
jibri01 2022-01-25 17:40:20.375 INFO: [61] [session_id=mcmrfdbvqqyzzcrm] FfmpegCapturer.onFfmpegStateMachineStateChange#130: Ffmpeg capturer transitioning from state Starting up to Error: QuitUnexpectedly SESSION plug:jibri01snoop: Input/output error
jibri01 2022-01-25 17:40:20.377 INFO: [61] [session_id=mcmrfdbvqqyzzcrm] StatefulJibriService.onServiceStateChange#39: File recording service transitioning from state Starting up to Error: QuitUnexpectedly SESSION plug:jibri01snoop: Input/output error
jibri01 2022-01-25 17:40:20.378 INFO: [61] XmppApi$createServiceStatusHandler$1.invoke#243: Current service had an error Error: QuitUnexpectedly SESSION plug:jibri01snoop: Input/output error, sending error iq <iq xmlns='jabber:client' to='jibribrewery@internal-auth.xmpp.jitsi.example.com/focus' id='K11YG-8' type='set'><jibri xmlns='http://jitsi.org/protocol/jibri' status='off' failure_reason='error' should_retry='true'/></iq>
jibri01 2022-01-25 17:40:20.378 INFO: [61] JibriManager.stopService#260: Stopping the current service
jibri01 2022-01-25 17:40:20.379 INFO: [61] [session_id=mcmrfdbvqqyzzcrm] FileRecordingJibriService.stop#181: Stopping capturer
jibri01 2022-01-25 17:40:20.381 INFO: [61] [session_id=mcmrfdbvqqyzzcrm] JibriSubprocess.stop#75: Stopping ffmpeg process
jibri01 2022-01-25 17:40:20.393 INFO: [61] [session_id=mcmrfdbvqqyzzcrm] JibriSubprocess.stop#89: ffmpeg exited with value 1
# cat /etc/asound.conf
#
# Place your global alsa-lib configuration here...
#

pcm.defmix {
  type dmix
  ipc_key 1643005026867
  slave.pcm "hw:Loopback,0,0"
}

pcm.defsnoop {
  type dsnoop
  ipc_key 1643005026869
  slave.pcm "hw:Loopback,1,0"
}

pcm.defduplex {
  type asym
  playback.pcm "defmix"
  capture.pcm "defsnoop"
}

pcm.!default {
  type plug
  slave.pcm "defduplex"
}

pcm.pjsuamix {
  type dmix
  ipc_key 1643103283998
  slave.pcm "hw:Loopback_1,0,0"
}

pcm.pjsuasnoop {
  type dsnoop
  ipc_key 1643103284002
  slave.pcm "hw:Loopback_1,1,0"
}

pcm.pjsuaduplex {
  type asym
  playback.pcm "pjsuamix"
  capture.pcm "pjsuasnoop"
}

pcm.pjsua {
  type plug
  slave.pcm "pjsuaduplex"
}

pcm.jibri01mix {
  type dmix
  ipc_key 1643103345706
  slave.pcm "hw:Loopback_2,0,0"
}

pcm.jibri01snoop {
  type dsnoop
  ipc_key 1643103345709
  slave.pcm "hw:Loopback_2,1,0"
}

pcm.jibri01duplex {
  type asym
  playback.pcm "jibri01mix"
  capture.pcm "jibri01snoop"
}

pcm.jibri01 {
  type plug
  slave.pcm "jibri01duplex"
}
# aplay -l

**** List of PLAYBACK Hardware Devices ****
card 0: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: Loopback_1 [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: Loopback_1 [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 2: Loopback_2 [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 2: Loopback_2 [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 3: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 3: AudioPCI [Ensoniq AudioPCI], device 1: ES1371/2 [ES1371 DAC1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Opps, sorry my bad, that I made the assumption you are part of the team.
I do not know kotlin, although I able to understand by just reading the code.

I also have question on jibri.conf on xmpp-server-hosts vs xmpp-domain which I think better I separate this into another thread.

Your jibri.conf is rife with errors.

That should be

domain = "internal.auth.xmpp.jitsi.example.com"

should be:

username = "jibri"

should be:

username = "recorder"

Did you rename that in your kernel? If not, it should be:

audio-device = "plug:bsnoop"

internal-auth.xmpp.jitsi.example.com is correct, as I defined as this in my prosody configuration.
same goes to the username, I register as jibri01, and recorderjibri01 in my prosody.
about the plug:jibri01snoop, I also define such in my asound configuration.
Is it is must be asnoop, bsnoop, csnoop ?

Here is my prosody configuration, and it is working great for my Jitsi-Meet, Jicofo, JVB, and coturn.

# cat /etc/prosody/conf.d/xmpp.jitsi.example.com.cfg.lua
use_libevent = true;

muc_mapper_domain_base = "xmpp.jitsi.example.com";

cross_domain_bosh = false;
consider_bosh_secure = true;
cross_domain_websocket = true;
consider_websocket_secure = true;
https_ports = { };

ssl = {
  protocol = "tlsv1_2+";
  ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
}

unlimited_jids = {
  "focus@auth.jitsi.example.com",
  "jvb@auth.jitsi.example.com"
}

external_service_secret = "Admin123";
external_services = {
  { type = "stun", host = "coturn.jitsi.example.com", port = 443 },
  { type = "turn", host = "coturn.jitsi.example.com", port = 443, transport = "udp", secret = true, ttl = 86400, algorithm = "turn" },
  { type = "turns", host = "coturn.jitsi.example.com", port = 443, transport = "tcp", secret = true, ttl = 86400, algorithm = "turn" }
};

VirtualHost "xmpp.jitsi.example.com"
  authentication = "internal_hashed"
  ssl = {
    key = "/appl/ssl/key/star.jitsi.example.com.nopwd.private.pem";
    certificate = "/appl/ssl/crt/star.jitsi.example.com.withca.crt";
  }
  av_moderation_component = "avmoderation.xmpp.jitsi.example.com"
  speakerstats_component = "speakerstats.xmpp.jitsi.example.com"
  conference_duration_component = "conferenceduration.xmpp.jitsi.example.com"
  modules_enabled = {
    "bosh";
    "websocket";
    "smacks";
    "pubsub";
    "ping";
    "speakerstats";
    "external_services";
    "conference_duration";
    "muc_lobby_rooms";
    "muc_breakout_rooms";
    "av_moderation";
    "external_services";
  }
  c2s_require_encryption = false
  lobby_muc = "lobby.xmpp.jitsi.example.com"
  breakout_rooms_muc = "breakout.xmpp.jitsi.example.com"
  main_muc = "conference.xmpp.jitsi.example.com"
  muc_lobby_whitelist = { "recorder.xmpp.jitsi.example.com" }
  smacks_max_unacked_stanzas = 5;
  smacks_hibernation_time = 60;
  smacks_max_hibernated_sessions = 1;
  smacks_max_old_sessions = 1;

Component "conference.xmpp.jitsi.example.com" "muc"
  restrict_room_creation = true
  storage = "memory"
  modules_enabled = {
    "muc_meeting_id";
    "muc_domain_mapper";
    "polls";
    "muc_rate_limit";
  }
  admins = { "focus@auth.jitsi.example.com" }
  muc_room_locking = false
  muc_room_default_public_jids = true

Component "breakout.xmpp.jitsi.example.com" "muc"
  restrict_room_creation = true
  storage = "memory"
  modules_enabled = {
    "muc_meeting_id";
    "muc_domain_mapper";
    "muc_rate_limit";
  }
  admins = { "focus@auth.jitsi.example.com" }
  muc_room_locking = false
  muc_room_default_public_jids = true

Component "internal-auth.xmpp.jitsi.example.com" "muc"
  storage = "memory"
  modules_enabled = {
    "ping";
  }
  admins = { "focus@auth.jitsi.example.com", "jvb@auth.jitsi.example.com" }
  muc_room_locking = false
  muc_room_default_public_jids = true

VirtualHost "auth.jitsi.example.com"
  authentication = "internal_hashed"
  ssl = {
    key = "/appl/ssl/key/star.jitsi.example.com.nopwd.private.pem";
    certificate = "/appl/ssl/crt/star.jitsi.example.com.withca.crt";
  }
  modules_enabled = {
    "limits_exception";
  }

Component "focus.xmpp.jitsi.example.com" "client_proxy"
  target_address = "focus@auth.jitsi.example.com"

Component "speakerstats.xmpp.jitsi.example.com" "speakerstats_component"
  muc_component = "conference.xmpp.jitsi.example.com"

Component "conferenceduration.xmpp.jitsi.example.com" "conference_duration_component"
  muc_component = "conference.xmpp.jitsi.example.com"

Component "avmoderation.xmpp.jitsi.example.com" "av_moderation_component"
  muc_component = "conference.xmpp.jitsi.example.com"

Component "avmoderation.xmpp.jitsi.example.com" "av_moderation_component"
  muc_component = "conference.xmpp.jitsi.example.com"

Component "lobby.xmpp.jitsi.example.com" "muc"
  storage = "memory"
  restrict_room_creation = true
  muc_room_locking = false
  muc_room_default_public_jids = true
  modules_enabled = {
    "muc_rate_limit";
    "polls";
  }

VirtualHost "guest.xmpp.jitsi.example.com"
  authentication = "anonymous"
  c2s_require_encryption = false
  modules_enabled = {
    "bosh";
    "websocket";
    "smacks";
    "pubsub";
    "ping";
    "speakerstats";
    "external_services";
    "conference_duration";
    "muc_breakout_rooms";
    "av_moderation";
    "external_services";
  }
  c2s_require_encryption = false
  breakout_rooms_muc = "breakout.xmpp.jitsi.example.com"
  main_muc = "conference.xmpp.jitsi.example.com"
  smacks_max_unacked_stanzas = 5;
  smacks_hibernation_time = 60;
  smacks_max_hibernated_sessions = 1;
  smacks_max_old_sessions = 1;

VirtualHost "recorder.xmpp.jitsi.example.com"
  modules_enabled = {
    "ping";
  }
  authentication = "internal_plain"

and my asound configuration

# cat /etc/asound.conf
#
# Place your global alsa-lib configuration here...
#

pcm.defmix {
  type dmix
  ipc_key 1643005026867
  slave.pcm "hw:Loopback,0,0"
}

pcm.defsnoop {
  type dsnoop
  ipc_key 1643005026869
  slave.pcm "hw:Loopback,1,0"
}

pcm.defduplex {
  type asym
  playback.pcm "defmix"
  capture.pcm "defsnoop"
}

pcm.!default {
  type plug
  slave.pcm "defduplex"
}

pcm.pjsuamix {
  type dmix
  ipc_key 1643103283998
  slave.pcm "hw:Loopback_1,0,0"
}

pcm.pjsuasnoop {
  type dsnoop
  ipc_key 1643103284002
  slave.pcm "hw:Loopback_1,1,0"
}

pcm.pjsuaduplex {
  type asym
  playback.pcm "pjsuamix"
  capture.pcm "pjsuasnoop"
}

pcm.pjsua {
  type plug
  slave.pcm "pjsuaduplex"
}

pcm.jibri01mix {
  type dmix
  ipc_key 1643103345706
  slave.pcm "hw:Loopback_2,0,0"
}

pcm.jibri01snoop {
  type dsnoop
  ipc_key 1643103345709
  slave.pcm "hw:Loopback_2,1,0"
}

pcm.jibri01duplex {
  type asym
  playback.pcm "jibri01mix"
  capture.pcm "jibri01snoop"
}

pcm.jibri01 {
  type plug
  slave.pcm "jibri01duplex"
}




# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: Loopback_1 [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: Loopback_1 [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 2: Loopback_2 [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 2: Loopback_2 [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 3: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 3: AudioPCI [Ensoniq AudioPCI], device 1: ES1371/2 [ES1371 DAC1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0




# cat /etc/modprobe.d/alsa-loopback.conf
options snd-aloop enable=1,1,1 index=0,1,2

Ah, if your definitions are different from the default, then that explains it. You didn’t make mention of that earlier. It might make it a bit tougher to help you debug issues because the base assumption is usually that you used the default definitions and configurations.

I’m guessing it needs to be bsnoop. There was a commit that explicitly specified bsnoop:

@Freddie , from the master branch source code, I dont see hardcoded bsnoop, may be that was old code.

How does the headless chrome learn that the audio input point is Loopback_2,0,0?

@emrah , I read some where chrome has an option
https://peter.sh/experiments/chromium-command-line-switches/#alsa-output-device

--alsa-output-device=

I somehow manage to suppress the error by using the format hw:2,0,0 instead of plug:xxx but it still has no sound on the recording, so I think most probably is due to my alsa config issue, which I am still figuring out. Display wise, it already able to record up to this stage.

I found the problem.
Basically all others are correct except the ipc_key I have defined with some auto generated random number is too long.
I shorten it to 8 digit and now everything works fine.
It able to record both video and audio.
Hence, @emrah, by using --alsa-output-device does the job.

The only problem now is the video and audio not in sync.
I suspect most probably is due to my jitsi test server is not enough resources as I run everything (meet, jvb, jicofo, prosody, coturn, jibri) in 1 server.

And I also able to run multiple Jibri on same server by defining multiple dummy display and multiple loopback sound card, together with alsa-output-device for headless chromedriver.
The only weakness now is jibri source is hardcoded with the display, hence I need to deploy multiple jibri source code for multiple jibri instance.
If Jibri can make it configurable for display just like audio device, then can run multiple jibri instance with one source code.

Why don’t you use containers?