Hosting XDC 2020
Together with mupuf we have hosted the X.Org Developers Conference 2020, which for obvious reasons was virtual this year. We were streaming it live on YouTube from mupuf’s basement over his 1Gbps download / 100Mbps upload fiber.
I have some limited experience with streaming on Twitch and a lot of experience with watching online speedrunning marathons like Games Done Quick and ESAMarathon. Funnily, I have enjoyed tweaking my streaming setup much more than the act streaming itself.
Because of the above, I had some ideas:
- no dead air
- minimize the room for (serious) errors
- focus on the audio quality
- embrace existing means of communication
No Dead Air
I cannot overstate how important this is for the viewing experience. By making sure there are no long periods of complete silence, especially combined with a static image, viewers are reassured that the stream is working.
There are two key elements:
Countdown timer - OBS has built-in scripting support. We have used Advanced Timer which can be set to count down to a particular date/time. This was handy as the conference was on a fixed schedule and we could just enter the time of the next talk. Thanks to this the screen was never static.
Additionally, viewers who don’t need to check the schedule all the time and know how long of a break they can take before the next talk are happy viewers :-)
Music - we have used just one track from YouTube’s audio library (free for use in videos) in a loop with lowered volume. I’ve tried to select something soothing that sounds a bit chip-tuney. We went with Jeremy Blake - Through The Crystal. Thanks to this the stream never went silent.
Taking this to a next level:
- an animated background
- a roller with relevant tweets/comments from the community
- a longer playlist on a loop
Minimize The Room For (Serious) Errors
The Three OBSes
Our setup involved 3 OBS instances, each one running on a separate computer, all of them were on the same gigabit ethernet switch.
The main OBS instance was streaming to YouTube and had exactly three scenes:
- one for technical difficulties
- one with a video feed from mupuf’s OBS
- one with a video from my OBS
This is the instance we cannot ever restart so it was intentionally kept as simple as possible.
The other two OBS instances were used by the hosts. We had 2 monitors each. While one person on our end was live hosting a talk, the other host was responsible for setting the title screen with the correct timer, contact the speaker(s), get them to a jitsi meeting room, help troubleshoot, tweak audio filters and make sure that everything works.
This means that each host has full control over their instance and can even reboot their full setup without taking the whole stream down.
We have used the excellent obs-ndi to have high quality and low latency obs-to-obs streaming.
Muting & Per-Scene Audio Capture
Another important thing is a microphone with a physical mute button and a clear indicator. My microphone has a red led that is on when I am unmuted. It starts blinking after I mute myself. I’ve always had it in my field of view.
I also find it better to disable the global desktop audio in OBS (Settings → Audio → Desktop Audio → Disabled), so it’s not present in each scene. Instead, we have added “Audio Output Capture (PulseAudio)” to the scene with Jitsi screen capture. This way we can freely talk with the presenter while the countdown timer is on and never care about manually muting or unmuting them for the stream. Everything was handled automagically as we were doing scene transitions.
Studio Mode
Controls → Studio Mode
With studio mode, you can see both the current live feed and preview of the scene you are about to switch. The scene in the preview can be edited.
Even with just 3-4 scenes, this visual confirmation that you are doing the right thing is very important.
Focus On The Audio Quality
Audio Processing
Audio is the most important part of a presentation. After all, the presenter is giving a talk, and the audience is not there to just have someone advance the slides for them. If the audio is too harsh, too noisy, or too hard to understand people will bounce off.
Nothing will replace a good microphone and a sound-treated room, but we can make things a bit better with the power of software. OBS has built-in support for audio filters. We have used:
- noise suppression with the default setting to get rid of the background noise
- compressor to make the volume range smaller - both screaming and whispers should have levels closer to normal speech
- limiter with the default -6dB to make sure we never clip
I’ve even authored OBS-LV2, which allows you to load a huge variety of LV2 plugins like equalizers, de-essers, etc. We haven’t used it for XDC though.
Also, noise suppression gets even better in OBS 26 as it includes RNNoise. Sadly, OBS 26 was at the release candidate stage at the time of the event.
Note: this is very simplified and I am not an audio engineer :-)
Audio Monitoring
To be sure that the audio sounds good, especially with all the filters applied, and to do the final fine-tuning we can use Advanced Audio Properties to enable the monitoring of our audio source.
To not hear double while monitoring (original and processed signal), we can route the monitored audio to another audio device (e.g. a bluetooth headset or a USB soundcard) using pavucontrol.
Another option is to create a null PulseAudio sink, route the jitis audio there, do a capture of that sink and then monitor on your usual audio device.
pacmd load-module module-null-sink sink_name=dummy-sink
pacmd update-sink-proplist dummy-sink device.description=dummy-sink
Embrace Existing Means Of Communication
Twitch and YouTube come with build-in chats, which are perfect if your audience is from all sorts for backgrounds. If you are streaming for a particular community though, you should embrace their usual means of communication.
You are mostly using Slack or Matrix? That should be the main communication channel for the conference. People will have their setups ready and will feel comfortable using them.
For us that was IRC and I think it worked really well :-)
One thing I would improve is to get rid of ##xdc2020-QA channel for question and answer. The questions from this channel were read out by the host to the presenter on the stream. It was a bit rude to remind people to switch the issuing discussion to the main channel after the talk has concluded. The split has also confused multiple people at multiple times.
Instead, I would just introduce a bot - let’s name it XDCQA. The question can then be asked on the main channel by addressing the bot. Hosts then can either highlight messages containing XDCQA in their IRC client of choice or grep the bot logs.
Random Tidbits
Technical Difficulties Screen
Song used: William Rosati - Lake George (also from YouTube’s audio library)
Full gif: xdc-technical-difficulties.gif (43 megs)
I’ve created a bunch of random glitched frames using jpg-glitch and selected the ones that look nice are unlikely to cause problems for the photosensitive folks. Then I have combined them into a gif with some ImageMagick:
convert -delay 10 -loop 0 \
{,,,,,,,,,,,,,,,,,,,,,,,,,}original.jpg \
glitched-*.jpg \
result.gif
Background Photo
The background photo we used for the stream and on Twitter was taken by me in Gdansk in 2016.
Using Jitsi
We have self-hosted (on VPSes) a few instances of Jitsi. It was used for the presenters to dial in and share their screens with the hosts.
It’s open source, runs in the browser, and has all the necessary features.
We have run into a couple of issues though:
- doesn’t work well with Firefox
- it is very-resource heavy - one presenter had a hard time running it on ThinkPad T420 as it was 100%-ing the CPU
Other than having to ask presenters to install Chromium it was a rather smooth experience.