Watching TV over the air on GNU/Linux

The Dutch public broadcasting authority allows us to stream public TV channels from their web site. However, those streams have some downsides: they're often laggy and low-bandwidth, but the biggest problem is that they require people to install either Widevine, Flash or Silverlight, all of which are pretty horrible security risks. (Yes, there are ways around this with youtube-dl and mpv, but they may break on any occasion.)



DVB-T receivers

To watch those channels without having to install malware, the first thing that came to mind was DVB-T, which transmits the public TV channels as free-to-air streams. One problem: DVB-T reception requires a TV. It would be nice to watch those streams on displays already there: computer monitors connected to Debian machines.

Enter the Realtek RTL2832. The GNU/Linux support of TV tuners is generally very decent, so you shouldn't worry too much about incompatibility. Firmware blobs, however, are often needed. But the RTL2832 does not require any blobs. All you need is a little antenna near a window and you're set.



Software installation

Watching DVB streams doesn't require a lot of special software: merely VLC and the dvb-apps package.

sudo apt install dvb-apps vlc vlc-plugin-zvbi

Scan for channels:

scan /usr/share/dvb/dvb-t/nl-All -o zap -x 0 | tee channels.conf

This creates a channel list in the working directory. (Needless to say, the nl-All file should only be used if you live in the Netherlands. Channge it accordingly.)

On some GNU/Linux distributions, you may encounter a message like “ERROR: cannot parse'[CHANNEL]”. In that case, you have to use the legacy channel lists:

scan /usr/share/dvb/dvb-legacy/dvb-t/nl-All -o zap -x 0 | tee channels.conf

If you have an RTL2832 on a recent kernel, scanning might fail or not return anything if you have the rtl2832_sdr module loaded. So unload it first:

sudo rmmod rtl2832_sdr

The output of a correct channels.conf file looks something like this:

NPO1:474000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:7011:7012:1101
NPO2:474000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:7021:7022:1102
NPO3:474000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:7031:7032:1103


Watching the streams

Once you have a list, you can simply drag the channels.conf file into a VLC window, which automatically converts it to a playlist. Press Ctrl + Y and save it as ~/Videos/TV.xspf (or whatever), and all you have to do is click the playlist and switch channels with the Previous / Next buttons.

If you're looking for a fancier GUI solution, you might want to check out MeTV. It can scan for channels on its own, but you can also import your channels.conf file. MeTV offers EPG viewing and MPEG stream recording (including timers).