Tip: Pulseaudio support for Jibri

Sure I’ll try it
Thanks @kpeiruza

Hello @kpeiruza It’s not working. I’m getting Recording failed to start. I’m using it with docker-compose

Logs

[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.

[cont-init.d] executing container initialization scripts...

[cont-init.d] 01-set-timezone: executing...
[cont-init.d] 01-set-timezone: exited 0.
[cont-init.d] 10-config: executing...
unix:path=/var/run/dbus/system_bus_socket,guid=1f3ec9a5fb6d2c02724883fc5ff2ec3e
W: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified).
[cont-init.d] 10-config: exited 0.
[cont-init.d] done.
[services.d] starting services
icewm-session: using /root/.icewm for private configuration files
_XSERVTransmkdir: ERROR: euid != 0,directory /tmp/.X11-unix will not be created.

X.Org X Server 1.19.2
Release Date: 2017-03-02
X Protocol Version 11, Revision 0
Build Operating System: Linux 3.16.0-5-amd64 x86_64 Debian
Current Operating System: Linux 55f24a8f03ff 4.15.0-128-generic #131-Ubuntu SMP Wed Dec 9 06:57:35 UTC 2020 x86_64
Kernel command line: BOOT_IMAGE=/vmlinuz-4.15.0-128-generic root=UUID=6ddac925-891d-48c1-b0d5-a2feb62d2367 ro earlyprintk nomodeset nofb vga=normal console=tty1 console=ttyS0
Build Date: 30 August 2020  03:55:49PM
xorg-server 2:1.19.2-1+deb9u6 (https://www.debian.org/support)
Current version of pixman: 0.34.0
        Before reporting problems, check http://wiki.x.org
        to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
        (++) from command line, (!!) notice, (II) informational,
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(++) Log file: "/tmp/xorg.log", Time: Mon Jan  4 15:51:51 2021
(++) Using config file: "/etc/jitsi/jibri/xorg-video-dummy.conf"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
[services.d] done.
IceWM: using /root/.icewm for private configuration files
icewmbg: using /root/.icewm for private configuration files
icewmtray: using /root/.icewm for private configuration files
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2021-01-04 15:51:53.053 WARNING: [26] org.jitsi.xmpp.mucclient.MucClient.log() Disabling certificate verification!
Starting ChromeDriver 86.0.4240.22 (398b0743353ff36fb1b82468f63a3a93b4e2e89e-refs/branch-heads/4240@{#378}) on port 4430
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

Hi,

We’re using that Docker image in several different environments. Could you please check chromedriver’s log inside the docker image and paste it here?

It’s located under /tmp inside jibri’s docker.

Thanks!

It’s working after restarting the container. But I’m facing an issue. I have started a meeting and start the recording. then second user joins the meeting. Finally when I stopped the recording I’m getting below error in logs. I’m getting this exception continuously unless I stopped the container.

2021-01-04 17:31:21.791 SEVERE: [126] org.jitsi.jibri.service.impl.FileRecordingJibriService.stop() Error writing metadata: com.fasterxml.jackson.databind.JsonMappingException: Class java.lang.String not subtype of [map type; class java.util.Map, [simple type, class java.lang.String] -> [simple type, class java.lang.Object]] (through reference chain: org.jitsi.jibri.service.impl.RecordingMetadata["participants"]->java.util.ArrayList[0]) with stack:
com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:391)
com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:363)
com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:338)
com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:123)
com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79)
com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18)
com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727)
com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719)
com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3893)
com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:3189)
org.jitsi.jibri.service.impl.FileRecordingJibriService.stop(FileRecordingJibriService.kt:186)
org.jitsi.jibri.JibriManager.stopService(JibriManager.kt:262)
org.jitsi.jibri.JibriManager$startService$1.invoke(JibriManager.kt:210)
org.jitsi.jibri.JibriManager$startService$1.invoke(JibriManager.kt:86)
org.jitsi.jibri.util.StatusPublisher$addStatusHandler$1.invoke(StatusPublisher.kt:37)
org.jitsi.jibri.util.StatusPublisher$addStatusHandler$1.invoke(StatusPublisher.kt:29)
org.jitsi.jibri.util.StatusPublisher$publishStatus$1.invoke(StatusPublisher.kt:53)
org.jitsi.jibri.util.StatusPublisher$publishStatus$1.invoke(StatusPublisher.kt:29)
kotlin.collections.CollectionsKt__MutableCollectionsKt.filterInPlace$CollectionsKt__MutableCollectionsKt(MutableCollections.kt:293)
kotlin.collections.CollectionsKt__MutableCollectionsKt.retainAll(MutableCollections.kt:284)
org.jitsi.jibri.util.StatusPublisher.publishStatus(StatusPublisher.kt:53)
org.jitsi.jibri.service.impl.FileRecordingJibriService.stop(FileRecordingJibriService.kt:190)
org.jitsi.jibri.JibriManager.stopService(JibriManager.kt:262)
org.jitsi.jibri.JibriManager$startService$1.invoke(JibriManager.kt:210)
org.jitsi.jibri.JibriManager$startService$1.invoke(JibriManager.kt:86)
org.jitsi.jibri.util.StatusPublisher$addStatusHandler$1.invoke(StatusPublisher.kt:37)
org.jitsi.jibri.util.StatusPublisher$addStatusHandler$1.invoke(StatusPublisher.kt:29)
org.jitsi.jibri.util.StatusPublisher$publishStatus$1.invoke(StatusPublisher.kt:53)
org.jitsi.jibri.util.StatusPublisher$publishStatus$1.invoke(StatusPublisher.kt:29)

Which version of jitsi-meet, jicofo and JVB are you using?

AFAIK we never saw those errors before…

Thanks!

El dl., 4 de gen. 2021, 13:21, metadata via Jitsi Community Forum - developers & users <jitsi@discoursemail.com> va escriure:

@kpeiruza am getting the below error in the container.

[cont-finish.d] executing container finish scripts…
[cont-finish.d] done.
[s6-finish] waiting for services.
unix:path=/var/run/dbus/system_bus_socket,guid=b170290cf67920a40149248f600085ba
W: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified).
[s6-finish] sending all processes the TERM signal.
[s6-finish] sending all processes the KILL signal and exiting.

Can you please paste how are you launching it? we’ve tested with docker-compose and kubernetes without issues…

jibri.yml.txt (1.5 KB)

@kpeiruza image

this my yaml file and this lsmod | greo snd_aloop output.

You don’t need snd_aloop when using pulseaudio…

@emrah I’ve got a PR in Jibri to make the audio source/device configurable (with the purpose being to move to pulse) here. Any thoughts on it?

Hello @bbaldino,

In my opinion, this PR is a good step if there is a plan to enable pulse on the long run but alone, it does not make pulse available. Because they are some tricks related with the pulseaudio daemon and this PR does not cover them.

Thanks…if I’m understanding you correctly there are other changes needed to get things working that happen outside the Jibri code, is that right? We’ll be working on those as well, but as far as changes to the Jibri code itself, how does it look?

Yes, it’s also needed some customizations related with icewm and pulseaudio

I think this is better than statically hardcoded. Most of the time, I use a fake ffmpeg to manipulate some params. It will be nice to be able to change them from jibri.conf :+1:

If anyone wants to try out jibri with PulseAudio on k8s then checkout this repo.

2 Likes