23 November 2023

Complete Linux-compatible streaming setup for under £1k

I started streaming on a Linux PC recently. Here’s the hardware and software setup I ended up going for.

TL;DR

Hardware

My main computer is an old i5 3470. It does the job, but does get laggy if you run a heavy JavaScript animation while streaming.

Note on encoding: some GPUs support hardware video encoding with various different formats and quality levels, which takes the burden of encoding off the CPU. I did manage to get this working at one point with an old Nvidia GT710, but can’t seem to make it work anymore. Software encoding works fine though.

Lighting

I use my normal room light with a small adjustable light mounted on my monitor to add a warm light to my face.

Camera & Lens

One thing I had to realise when trying to obtain a decent camera is that in the photography world, you buy a body and a lens—there’s no such thing as just “a camera”. I resisted this for a while but it wasn’t too much of a learning curve in the end. I watched this video and ended up going for one of the lenses mentioned.

Camera: Sony A6000

The main feature the camera needs to have is a “clean HDMI output”. This means that it can send its viewfinder image to an HDMI TV without the battery indicator etc being on the screen. Otherwise those elements would be visible on the stream, as that HDMI feed is what we’re using for the video.

Lens: Sigma 16mm F1.4 DC CN

Another point to note is that there’s generally no such thing as a “high quality webcam”—if you want a decent image you have to go for a photography camera or a camcorder.

Camera Arm

Tarion Desk Mount Arm.

This arm seems very secure and well-built for the price. It’s a bit of a hassle to adjust—you can’t just move it like with friction-based arms—but that’s not an issue if you don’t do it too often. Each joint has 360 degrees of rotation, so it’s easy to get it into pretty much any orientation. I have the camera sitting right on top of my monitor, which wouldn’t be feasible with a tripod.

I tried a tripod initially (Neewer Mini Travel Tripod) but found that placing it was awkward due to the large footprint, and it didn’t seem very stable. (And a more stable one would have an even larger footprint.) Also, a camera with a large lens can be quite front-heavy, which makes things worse stability-wise.

Dummy Battery

Cameras don’t like doing stuff while charging, apparently, so to get infinite runtime you have to use a dummy battery. For the A6000, search “NP FW50 dummy battery” or use Neewer AC-PW20.

Microphone

MSI GV60 USB mic.

It has 4 different settings for where the sound will be coming from. The best one for a single person streaming is probably “cardioid”, where the sound is only picked up from the front (the front being the face with the controls and LED on). This means you can almost eliminate e.g. keyboard noise, but it has the disadvantage that you have to have the mic right next to your face and in the right orientation to get a good signal.

Microphone Boom Arm

InnoGear Boom Arm. Cheap and works well. The only issue is that the mic can end up facing the wrong way when when screwed in properly, but this seems to be a problem with a lot of arms/mics.

I tried the RØDE PSA1 initially but the way the mic attached made it hard to get it screwed in properly while plugged in.

Capture Card

AVerMedia Live Gamer HD 2 PCIe card.

This is needed turn the camera’s HDMI feed into a virtual webcam. The video feed you see on the stream is coming from the camera’s ability to send its viewfinder image to an HDMI TV.

I also tried the Elgato Cam Link as well as some copycat USB cards, but they either didn’t work or had bad image quality.

Misc

Software

The software setup is basically OBS -> Twitch.

You set up a Twitch account, which gives you a streaming key. You then put this into OBS via the settings, and OBS and Twitch handle the rest—when you click Start Streaming in OBS, you go live on Twitch.

OBS

The main concept to learn about OBS is that it has two levels of settings: “Profiles” and “Scene collections”.

Most settings—like the stream key and encoding settings—are stored in profiles. This lets you keep different use-cases separate.

Scene collections are the arrangements of what’s on the screen and what sound inputs are captured.

Profiles and scene collections can be selected in any combination for flexibility—to switch between projects you may have to select both a profile and a scene collection.

Troubleshooting

Focus

I had focus issues on my first stream. At a certain point the image just went out of focus and wouldn’t come back. I think I might have let the lens autofocus overheat, or something, as I had it on the lowest “F” setting for maximum background-blurriness. Setting this to a slightly higher value seems to have resolved the issue.

Video feed not displaying

It can sometimes be tricky to get the feed to go from the camera to the capture card. Pressing the shutter button half-way down usually brings it to life, or failing that turning the camera off and on and/or unplugging the HDMI and plugging it back in. Restarting OBS is also sometimes necessary.

(Linux) Mic auto-selection

My mic kept automatically setting itself as the default speaker output, as it has a headphone jack. If you don’t want to use headphones, you may have to run a script that continually re-sets your sound output device. I used:

#!/bin/bash

# set audio output to default as plugging in USB mic sets it to that

while true; do
	pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
	sleep 2
done

Use pactl list short sinks to find which output to use in the above script.