Hosting XDC 2020

2020-09-20, by ivyl

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 of streaming itself.

Because of the above, I had some ideas:

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.

timer (click to go to the video)

Taking this to a next level:

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:

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.

output caputre tied to a scene

Studio Mode

Controls → Studio Mode

With studio mode, we could see both the current live feed and preview of the scene we were about to switch to. The scene being previewed could also be edited.

Even with just 3-4 scenes, this visual confirmation that we are doing the right thing is very important.

studio mode

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:

audio filters

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.

audio monitoring

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.

output switching

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 of different 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:

Other than having to ask presenters to install Chromium it was a rather smooth experience.