Recording Audio and Video on Linux

PipeWire, EasyEffects and V4L

Recently I switched my work computer from Windows to Linux (Fedora 35), and I needed to re-learn all things about video and audio configurations.

This describes how I configure webcam, OBS and virtual audio devices. Please bookmark this and re-visit it now as I’ll update it when I learn something new.

The environment

I’m using Fedora Fedora 35 on a laptop in my home office. The setup described below is optimized for video meetings, and an occasional online conference attendance.

As microphone I use a RØDE VideoMic NTG, as a headset I use a Jabra Evolve 40. I introduced both of them in my post about how to record voice on Windows. The camera is a Logitech BRIO 4K Webcam.

Setup for everyday calls

When I started working on the Linux laptop, I was looking for a setup that provided a pleasant voice and video quality with minimal complexity. This is what I came up with.

Quick Video Setup

The Logitech camera worked out of the box. Google Meet will cap the video quality at 720p, so zooming in is fine: The camera’s 4K gives me enough slack to use the included pan and zoom functionality.

After installing gtk-v4l I was able to set up my camera parameters. I usually zoom in so that I appear in the videos from my chest upwards.

By default, the camera will adjust the white balance, focus and lighting automatically. I found it adjusts the white balance well, and the auto-focus doesn’t interfere during calls.

Sometimes I adjust them manually to avoid the camera to adjust in mid-call, so I set a manual focus, manual white balance and manual exposure. Manual exposure helps a lot when the light of the soft boxes makes me appearing too bright while the background is not so well lit. Turning down the gain removes the noise in the video picture, still this only works when using my soft boxes (2x50 W LED), otherwise the long exposure time leads to a very low frame rate.

Quick Audio Setup

Once I connected my audio devices via USB, Fedora registered them automatically. I run my RØDE VideoMic NTG on -20 dB with the built in compensation for the foam windshield.

It troubled me that even when I turned up the input volume in the system settings to 100%, some application always leveled it down. Then I figured out that this happened every time I used Google Meet using Chrome.

Apparently, this is a known issue. The fix for me was to select not the default input in Chrome, but to select the RØDE VideoMic NTG directly. Once I did that, Chrome didn’t adjust the volume levels automatically any more, and the void quality is now great. I checked this also in the PulseAudio Volume Control (on the command line called pavucontrol) — all inputs are now on 100%.

Full Screen Sharing

The default settings in Google Chrome and Google Meet allowed me to share only tabs. As I’m a developer, I also want to share my IDE, and this works best when sharing a full screen. It also troubled me as when sharing a tab, then switching to another tab, I was several times wondering why the other person was seeing something different from I saw. Google Chrome expected me to re-share each new tab I switched to, which is tedious. I love tabs, and I want to share them as I switch.

Fedora uses PipeWire to share screens, and support for that in Chrome is currently behind a feature flag that is off by default. Enter chrome://flags/#enable-webrtc-pipewire-capturer in your Chrome browser to activate it, and see these PipeWire docs for details.

Adding more effects

Tuning the Voice

One simple possibility is to install EasyEffects. Once I start it, it adds a new sink and source to my audio devices. In the PipeWire tab, I set it up to use the RØDE as the microphone and the Jabra as the output device. Then I can add plugins to the input and the output channels. On the input tab, I chose “plugins” in the lower part of the window and added a deesser, compressor and noise reduction plugin. Besides a little input gain for the compressor, the defaults worked well for me. In the lower right corner, there is a small icon that enabled me to hear my own voice for testing.

pipewire screenshot
Figure 1. Screenshot of PipeWire

The new sink and source of EasyEffects is available only when the application is running.

During the process I also tried out Ardour, that allowed me to apply several filters to my microphone. It allowed me a greater flexibility of LV2 plugins. I tried, for example, “Noise repellent” and the LDP Compressor. Using the following, I created a virtual device that I used to route the output of Ardour to a virtual input device that I could then select, for example, in Google Meet:

pactl load-module module-null-sink sink_name=loopback media.class=Audio/Duplex

I decided that Ardour is not worth the additional complexity it added to my current setup, so I’ll stay with EasyEffects for now.

Tuning the Video

To use virtual backgrounds across applications and a green screen, I installed OBS Studio plus some filters from StreamFX.

It will readily capture input from the camera. To output the composed image on a virtual camera, use v4l2loopback (pre-packaged available from rpmfusion). I also added a green screen, and after I installed the VLC media player I could play remote videos as a background. I haven’t been able to use a browser as a video source yet.

I also haven’t been able to duplicate my camera to have it in the configuration with and without a green screen yet, so I set the similarity in the filter to zero for now when I don’t have a green screen active.

Looking to the future

This article will grow over time. Please let me know where to add more details or a screenshot. An application that I might give a try soon is Carla that can host LV2 and other plugins and can serve as virtual switchboard.

What other settings or tools do you recommend? I haven’t yet searched for a simple to use soundboard, suggestions are very welcome.

2022-03-20: Initial draft.
2022-03-27: Review, adding Carla as something to try out.

Back to overview...