Capture OTA TV and Transcode on the Fly with FFmpeg

Capturing over-the-air (OTA) television broadcasts and transcoding them in real-time is a highly efficient way to stream or archive live TV. This guide provides a direct, step-by-step walkthrough on how to use a TV tuner card on a Linux system to tune into a broadcast channel and utilize FFmpeg to transcode the incoming MPEG-TS stream on the fly into a highly compatible H.264/AAC format.

Prerequisites

Before beginning, ensure you have the following hardware and software configured: * TV Tuner Card: An ATSC (North America) or DVB-T/T2 (Europe/other regions) USB dongle or PCIe card installed and recognized by your system. * Linux Drivers: The card should be registered under /dev/dvb/adapter0/. * FFmpeg: Installed with support for the H.264 encoder (libx264) and AAC audio encoder. * Tuning Utilities: Install v4l-utils (which includes dvbv5-zap) or w_scan to generate channel configuration files.


Step 1: Scan and Generate a Channel List

You must first scan for available OTA frequencies to generate a configuration file. Use w_scan or dvbv5-scan depending on your region.

For DVB-T (Europe):

w_scan -ft -c US > channels.conf

(Replace US with your country code, e.g., DE for Germany or GB for the United Kingdom).

This command creates a channels.conf file containing the frequency, program ID (PID), and modulation details for every available channel in your area.


Step 2: Tune the Channel and Pipe to FFmpeg

Because TV tuner cards output raw MPEG-TS streams, you need to tune the card to a specific channel first. The most efficient way to capture and transcode simultaneously is to use dvbv5-zap to tune the card, then pipe the output stream directly into FFmpeg.

Run the following command to tune to a channel named “PBS” (replace this with a channel name from your channels.conf file) and transcode it:

dvbv5-zap -c channels.conf -r "PBS" -o - | ffmpeg -i - \
  -c:v libx264 -preset veryfast -crf 23 \
  -c:a aac -b:a 128k \
  -f mp4 output.mp4

Command Breakdown


Hardware Accelerated Transcoding (Optional)

If your CPU struggles to keep up with real-time encoding, you can offload the processing to an NVIDIA GPU (using NVENC) or an Intel CPU (using VAAPI).

Intel VAAPI Example:

dvbv5-zap -c channels.conf -r "PBS" -o - | ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i - \
  -vf 'format=nv12,hwupload' -c:v h264_vaapi -qp 24 \
  -c:a aac -b:a 128k \
  -f mp4 output.mp4

NVIDIA NVENC Example:

dvbv5-zap -c channels.conf -r "PBS" -o - | ffmpeg -i - \
  -c:v h264_nvenc -preset fast -cq 23 \
  -c:a aac -b:a 128k \
  -f mp4 output.mp4