After my recent post about virtual events there were a few questions about my setup, so here are some more details. All this assumes Linux obviously, but supposedly this is also possible on Windows (with different tools and plugins for the virtual webcam/microphone).

Remote conference participation setup.
My setup for participating in virtual conferences.

Audio

Audio is probably the most important aspect, so if you want to invest in equipment that’s the first thing to look into.

I got a “Røde smartLav” lavalier microphone for about 50€, based on recommendations from my colleagues at work doing video production. It has a standard audio jack connector and thus can be used without needing an additional audio interface providing phantom power.

As a lavalier microphone takes a bit longer to put on than a headset (you want to run the wires properly under your shirt), and due to its short and fragile cable I also got a small and simple USB audio interface for a few Euros to handle the mic and a pair of in-ear headphones. That allows me to (dis)connect the entire “on body” audio equipment with a single longer/robust USB cable, making it as easy as with a headset to quickly get up and grab something to eat/drink during a long conference day.

Video

For the video part I got a “Logitech C920s” webcam, providing full HD resolution and working out of the box on Linux. That model however seems currently very hard to obtain here in Germany at least, let alone for a vaguely reasonable price.

While the image quality is ok, its wide angle view isn’t ideal, easily capturing the entire room rather than just the speaker. It does come with a clip to be mounted on top of a screen as well as a standard tripod mount, so that gives you quite some flexibility on the positioning at least.

I suspect that any half-way recent USB webcam will also do the job. If you happen to have an action cam it’s worth checking if that can operate as a USB webcam as well (some do). Photo cameras with a clean HDMI feed seem to be the method of choice for high quality setups, combined with an USB HDMI capture stick. If you happen to have such a camera already anyway that might be worth looking into.

Lights

I have a plain white wall behind my desk, which is quite useful for indirect lighting, avoiding spots and shadows. More light is usually better, to reduce camera noise. I have a regular dimmable LED lamp shining towards the wall/ceiling here (not specifically for this, that’s my regular office lighting). This provides enough light, but it has a fairly low color temperature (2.700K), which is a bit too warm/yellow-ish, something more towards 4.500K would probably be better.

OBS

Both the audio and video would be usable as-is, but there’s quite a bit of improvement to be achieved by some basic filtering. I’m using OBS for that, which can also be used for pre-recording presentations for events requiring that.

Audio Settings

Configuration dialog for audio filters in OBS.
OBS audio filter configuration.

Again, improvements to audio have the most impact. Audio filters can be added in OBS via the gear icon next to the mic level meter. I’m using the following two:

  • Noise Suppression (all default settings): As one would suspect this removes white noise from the audio feed, in particular that introduced by the audio interface as well as e.g. fan noise.
  • Expander (all default settings, “Detection” set to “Peak”): I’m actually not quite sure what this does exactly, but it does reliably get rid of the remaining background noises (typing, clicking, squeaking chair, etc), without compromising the voice quality.

It’s very much worth trying the available filters and experiment with their settings, as quite possibly you need a slightly different setup based on your environment and equipment.

Video Settings

Video filters are available via right clicking on the camera in the source view (bottom, second from the left), the only one I use there is “Crop/Pad”, to deal with the wide angle view of my camera.

One other settings was needed though, as out of the box I was only getting ~5fps at the full resolution. That was fixed by changing the the “Video Format” setting in the camera properties to anything but the default. That didn’t seem to have any visual effect, but the frame rate went up to the expected 30fps.

Configuration dialog for video camera properties in OBS.
OBS camera properties.

Scenes

The other thing to set up in OBS are scenes (bottom left). In the simplest case you just need one showing the camera full-screen. If you are pre-recording or the conference software isn’t handling slides/screen shares separately you probably also want an additional scene containing the slides (via a screen or window capture source) and a smaller camera image on top.

The more physical screens you have the better, being able to dedicate one to what’s being captured and one for the conference software/communication and OBS helps a lot with not having the wrong things show up in the video stream.

Virtual Webcam

For pre-recording we are done at this point, for live events we however still need to get the audio and video feeds from OBS into the corresponding conference software. The common way for this seems to be virtual/loopback devices, looking like a regular webcam or microphone to the consuming software.

For the video side this is provided by the v4l2loopback driver. Assuming your Linux distribution has that packaged already, it just needs to be loaded to create a virtual camera:

modprobe v4l2loopback card_label="OBS"

The second part that’s needed is the v4l2sink plug-in for OBS. Via Tools > v4l2sink in OBS you can then feed OBS’ video stream into the virtual camera. The only setting that might need adjustment there is the device path, that depends on how many other video devices are connected to your system, and in which order. Picking the wrong one is the most likely cause for any error you might see there.

Configuration dialog for the virtual webcam in OBS.
OBS v4l2sink properties.

PulseAudio

For audio we need to do something similar using PulseAudio. The needed components are the pactl command line tool (likely already part of your default installation), and a mixer GUI that gives you access to every little PulseAudio detail, such as pavucontrol.

The following commands will add the necessary virtual device:

pactl load-module module-null-sink sink_name=virtual_mic sink_properties=device.description=VirtualMic
pactl load-module module-loopback source=virtual_mic.monitor latency_msec=0

With that done and all involved applications started, you can wire things up in the PulseAudio mixer:

  • Playback: Set OBS’ output to use the VirtualMic device, set the conference software to use the audio device your headphones are connected to.
  • Recording: Set OBS to use the audio device connected to your microphone, set the conference software to use “Monitor of VirtualMic”.
  • Output devices: Ensure VirtualMic is not muted.
  • Input devices: Ensure “Monitor of VirtualMic” and your physical mic are not muted.

Fortunately PulseAudio persists those settings even over application restarts and re-plugging devices, so unless things get messed up this is a one-time procedure. There might also be better explanations or easier approaches for this, but hopefully this at least provides a few hints on what to search for.

Conclusion

While the OBS-based setup is certainly very powerful (and this isn’t even scratching the surface), it’s also complex and fragile, particularly given my limited familiarity with the involved technologies. Not ideal, as the last thing you want is fighting setup issues during a live presentation. So let’s see how well this holds up at KDE Akademy in less than two weeks :)