Parcourir la source

jibri: switch to PulseAudio

Using PulseAudio means no longer needing to mount /dev/snd/ which should
make deploying Jibri much easier.

Credits:

https://github.com/openfun/jibri-pulseaudio
https://community.jitsi.org/t/tip-pulseaudio-support-for-jibri/65780
https://github.com/kpeiruza/jitsi-images
Saúl Ibarra Corretgé il y a 2 ans
Parent
commit
fbb8a2dbfe

+ 0 - 7
jibri.yml

@@ -9,15 +9,10 @@ services:
             - /dev/shm:/dev/shm
         cap_add:
             - SYS_ADMIN
-            - NET_BIND_SERVICE
-        devices:
-            - /dev/snd:/dev/snd
         environment:
             - CHROMIUM_FLAGS
             - DISPLAY=:0
             - ENABLE_STATS_D
-            - JIBRI_FFMPEG_AUDIO_SOURCE
-            - JIBRI_FFMPEG_AUDIO_DEVICE
             - JIBRI_HTTP_API_EXTERNAL_PORT
             - JIBRI_HTTP_API_INTERNAL_PORT
             - JIBRI_RECORDING_RESOLUTION
@@ -30,7 +25,6 @@ services:
             - JIBRI_RECORDING_DIR
             - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH
             - JIBRI_STRIP_DOMAIN_JID
-            - JIBRI_LOGS_DIR
             - PUBLIC_URL
             - TZ
             - XMPP_AUTH_DOMAIN
@@ -45,4 +39,3 @@ services:
             - jicofo
         networks:
             meet.jitsi:
-

+ 3 - 2
jibri/Dockerfile

@@ -18,8 +18,9 @@ ARG CHROMEDRIVER_MAJOR_RELEASE=102
 COPY rootfs/ /
 
 RUN apt-dpkg-wrap apt-get update && \
-    apt-dpkg-wrap apt-get install -y jibri libgl1-mesa-dri procps jitsi-upload-integrations jq && \
+    apt-dpkg-wrap apt-get install -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" jibri libgl1-mesa-dri procps jitsi-upload-integrations jq pulseaudio dbus dbus-x11 rtkit && \
     /usr/bin/install-chrome.sh && \
-    apt-cleanup
+    apt-cleanup && \
+    adduser jibri rtkit
 
 VOLUME /config

+ 2 - 6
jibri/rootfs/defaults/jibri.conf

@@ -103,14 +103,10 @@ jibri {
 
     ffmpeg {
       resolution =  "{{ $JIBRI_RECORDING_RESOLUTION }}"
-      {{ if .Env.JIBRI_FFMPEG_AUDIO_SOURCE -}}
       // The audio source that will be used to capture audio on Linux
-      audio-source = "{{ .Env.JIBRI_FFMPEG_AUDIO_SOURCE }}"
-      {{ end -}}
-      {{ if .Env.JIBRI_FFMPEG_AUDIO_DEVICE -}}
+      audio-source = "pulse"
       // The audio device that will be used to capture audio on Linux
-      audio-device =  "{{ .Env.JIBRI_FFMPEG_AUDIO_DEVICE }}"
-      {{ end -}}
+      audio-device =  "default"
     }
 
     {{ if .Env.CHROMIUM_FLAGS -}}

+ 4 - 6
jibri/rootfs/defaults/logging.properties

@@ -1,29 +1,27 @@
-{{ $JIBRI_LOGS_DIR := .Env.JIBRI_LOGS_DIR | default "/config/logs" -}}
-
 handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
 
 org.jitsi.utils.logging2.JitsiLogFormatter.programname=Jibri
 
 java.util.logging.FileHandler.level = FINE
-java.util.logging.FileHandler.pattern   = {{ $JIBRI_LOGS_DIR }}/log.%g.txt
+java.util.logging.FileHandler.pattern   = /config/logs/log.%g.txt
 java.util.logging.FileHandler.formatter = org.jitsi.utils.logging2.JitsiLogFormatter
 java.util.logging.FileHandler.count = 10
 java.util.logging.FileHandler.limit = 10000000
 
 org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.level = FINE
-org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.pattern   = {{ $JIBRI_LOGS_DIR }}/ffmpeg.%g.txt
+org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.pattern   = /config/logs/ffmpeg.%g.txt
 org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.formatter = org.jitsi.utils.logging2.JitsiLogFormatter
 org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.count = 10
 org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.limit = 10000000
 
 org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.level = FINE
-org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.pattern   = {{ $JIBRI_LOGS_DIR }}/pjsua.%g.txt
+org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.pattern   = /config/logs/pjsua.%g.txt
 org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.formatter = org.jitsi.utils.logging2.JitsiLogFormatter
 org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.count = 10
 org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.limit = 10000000
 
 org.jitsi.jibri.selenium.util.BrowserFileHandler.level = FINE
-org.jitsi.jibri.selenium.util.BrowserFileHandler.pattern   = {{ $JIBRI_LOGS_DIR }}/browser.%g.txt
+org.jitsi.jibri.selenium.util.BrowserFileHandler.pattern   = /config/logs/browser.%g.txt
 org.jitsi.jibri.selenium.util.BrowserFileHandler.formatter = org.jitsi.utils.logging2.JitsiLogFormatter
 org.jitsi.jibri.selenium.util.BrowserFileHandler.count = 10
 org.jitsi.jibri.selenium.util.BrowserFileHandler.limit = 10000000

+ 1 - 17
jibri/rootfs/etc/cont-init.d/10-config

@@ -21,22 +21,6 @@ fi
 [ -z "${DISPLAY}" ] \
 && ( echo -e "\e[31mERROR: Please set DISPLAY variable.\e[39m"; kill 1; exit 1 )
 
-# check loaded snd_aloop module and exit if is not loaded on the host
-[ -z "$(lsmod | grep -om1 snd_aloop)" ] \
-&& ( echo -e "\e[31mERROR: Please load snd-aloop module on the docker host.\e[39m"; kill 1; exit 1 )
-
-# get host's audio group id
-host_audio_group="$(stat -c %g /dev/snd/pcmC0D0p 2>/dev/null)"
-
-# audio group is not found. Has it been run without jibri.yml?
-[ -z "${host_audio_group}" ] \
-&& ( echo -e "\e[31mERROR: Binding /dev/snd is not found. Please check that you run docker-compose with -f jibri.yml.\e[39m"; kill 1; exit 1 )
-
-# try to create group with this id. If group with the id already exists, just skip
-groupadd -g ${host_audio_group} jibri-audio >/dev/null 2>&1
-# include user to the group by id
-usermod -aG ${host_audio_group} jibri
-
 # script for finalizing must have executing bit.
 [ ! -z "${JIBRI_FINALIZE_RECORDING_SCRIPT_PATH}" ] \
 && [ -f "${JIBRI_FINALIZE_RECORDING_SCRIPT_PATH}" ] \
@@ -57,6 +41,6 @@ mkdir -p ${JIBRI_RECORDING_DIR}
 chown -R jibri ${JIBRI_RECORDING_DIR}
 
 # make logs dir
-[ -z "${JIBRI_LOGS_DIR}" ] && export JIBRI_LOGS_DIR=/config/logs
+JIBRI_LOGS_DIR=/config/logs
 mkdir -p ${JIBRI_LOGS_DIR}
 chown -R jibri ${JIBRI_LOGS_DIR}

+ 2 - 0
jibri/rootfs/etc/fix-attrs.d/10-jibri

@@ -0,0 +1,2 @@
+/home/jibri/.config true jibri 0640 0750
+/home/jibri false jibri 0640 0750

+ 69 - 0
jibri/rootfs/etc/pulse/default.pa

@@ -0,0 +1,69 @@
+#!/usr/bin/pulseaudio -nF
+#
+# This file is part of PulseAudio.
+#
+# PulseAudio is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# PulseAudio is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+
+# This startup script is used only if PulseAudio is started per-user
+# (i.e. not in system mode)
+
+# Customized for Jibri
+
+.fail
+
+### Automatically restore the volume of streams and devices
+load-module module-device-restore
+load-module module-stream-restore
+load-module module-card-restore
+
+### Automatically augment property information from .desktop files
+### stored in /usr/share/application
+load-module module-augment-properties
+
+### Should be after module-*-restore but before module-*-detect
+load-module module-switch-on-port-available
+
+### Load several protocols
+load-module module-native-protocol-unix
+
+### Automatically restore the default sink/source when changed by the user
+### during runtime
+### NOTE: This should be loaded as early as possible so that subsequent modules
+### that look up the default sink/source get the right value
+load-module module-default-device-restore
+
+### Automatically move streams to the default sink if the sink they are
+### connected to dies, similar for sources
+load-module module-rescue-streams
+
+### Make sure we always have a sink around, even if it is a null sink.
+load-module module-always-sink
+
+### Honour intended role device property
+load-module module-intended-roles
+
+### Automatically suspend sinks/sources that become idle for too long
+load-module module-suspend-on-idle
+
+### If autoexit on idle is enabled we want to make sure we only quit
+### when no local session needs us anymore.
+#.ifexists module-console-kit.so
+#load-module module-console-kit
+#.endif
+#.ifexists module-systemd-login.so
+#load-module module-systemd-login
+#.endif
+
+### Enable positioned event sounds
+load-module module-position-event-sounds

+ 4 - 0
jibri/rootfs/etc/services.d/30-pulse/run

@@ -0,0 +1,4 @@
+#!/usr/bin/with-contenv bash
+
+HOME=/home/jibri
+exec s6-setuidgid jibri /bin/bash -c "exec /usr/bin/pulseaudio"

+ 0 - 0
jibri/rootfs/etc/services.d/30-jibri/finish → jibri/rootfs/etc/services.d/40-jibri/finish


+ 0 - 0
jibri/rootfs/etc/services.d/30-jibri/run → jibri/rootfs/etc/services.d/40-jibri/run


+ 1 - 0
jibri/rootfs/home/jibri/.config/pulse/client.conf

@@ -0,0 +1 @@
+autospawn = no

+ 9 - 0
jibri/rootfs/home/jibri/.config/pulse/daemon.conf

@@ -0,0 +1,9 @@
+daemonize = no
+high-priority = no
+realtime-scheduling = yes
+realtime-priority = 5
+exit-idle-time = -1
+flat-volumes = no
+deferred-volume-safety-margin-usec = 1
+log-level = info
+log-target = file:/config/logs/pulse.log

+ 8 - 0
jibri/rootfs/home/jibri/.config/pulse/default.pa

@@ -0,0 +1,8 @@
+.include /etc/pulse/default.pa
+
+# Load the virtual sink and set it as default
+load-module module-virtual-sink sink_name=jibri-loop
+set-default-sink jibri-loop
+
+# set the monitor of the jibri-loop sink to be the default source
+set-default-source jibri-loop.monitor