Table of Contents

Using the Ion "Video Forever" USB video capture box on Linux

:!: Warning :!:
For some reason the audio inputs on the Video Forever won't work if PulseAudio attaches to them.
If it seems like the audio input on your card just doesn't work, follow the steps below to make PulseAudio ignore it.
I haven't bothered to debug this, because capturing through ALSA should give better A/V synchronisation anyway.

The Ion “Video Forever” is a fairly unremarkable USB2 video capture box. Hardware wise, it's very similar to the Terratec Grabby (linuxtv wiki link) but uses a different AC97 codec. I picked it up for some years ago from a Maplins bargain-bin for £30.

It identifies itself to the USB host as:

It has composite and S-Video video inputs, and stereo audio inputs.

Fixing hardware detection and PulseAudio conflicts

The EM28xx driver doesn't detect the Video Forever by default. To work around this –

Edit /etc/modules to add this line:

em28xx

Create /etc/modprobe.d/local-em28xx-ionvideo.conf with the following contents:

options em28xx card=67
install em28xx /sbin/modprobe --ignore-install em28xx $CMDLINE_OPTS && { echo eb1a 5124 > /sys/bus/usb/drivers/em28xx/new_id ; : ; }

These two changes cause the em28xx driver to load on boot, override the detected board ID to 67, and add the new USB ID to the em28xx driver when it loads.

Now create /etc/udev/rules.d/99-local-videoforever.rules with the following contents:

# Make PulseAudio ignore the Ion Video Forever capture card (it only works with ALSA)
SUBSYSTEM=="sound", ATTRS{idVendor}=="eb1a", ATTRS{idProduct}=="5124", ENV{PULSE_IGNORE}="1"

Capturing with FFMPEG

Here's a script to record the video from the Video Forever into an MP4 file:

#!/bin/bash -xe
 
# Start by finding the EM28xx device names
VDEV=$(readlink -f /dev/v4l/by-id/usb-eb1a_* | head -n1)
ADEV=$(grep -l 'eb1a:5124' /proc/asound/card*/usbid | head -n1 |sed -e 's:.*card::' -e's:/usbid::')
 
echo "Video device ${VDEV}"
echo "Audio device ${ADEV}"
 
 
# --- Set defaults ---
 
# Default to MPEG-4 AVC video compression at the specified bitrate, with AAC audio
# This is necessary to produce MP4 video which can be decoded with hardware decoders e.g. NVDEC
VSET="-profile:v high -pix_fmt yuv420p -level:v 4.1 -vcodec libx264"
VBITRATE=4M
 
# AAC audio
ASET="-acodec aac"
 
# Video encode preset
PRESET="-preset veryfast -b:v $VBITRATE"
 
# Default to scaling by storing the video as-captured but setting the DAR.
# Assume 4:3 unless we're told otherwise.
SCALE="-vf setdar=dar=4/3"
 
# --- Parse command line parameters ---
while (( "$#" )); do
	case "$1" in
		ffv1)
			# Switch to FFV1 (lossless) compression with uncompressed audio
			# --- Uncomment this to switch to Lossless FFV1.3, YUV422 mode, with a GOP size of 1
			# --- See https://trac.ffmpeg.org/wiki/Encode/FFV1
			# --- Output size is ~21-28GB per hour, per https://www.reddit.com/r/DataHoarder/comments/da1zpt/comment/f1n40dd/
			ASET="-acodec copy"
			VSET="-vcodec ffv1 -level 3 -coder 1 -context 1 -g 1 -slicecrc 1 -pix_fmt yuv422p -rtbufsize 50M"
			PRESET=""
			;;
 
		4x3)
			# Display aspect ratio: 4x3 (default)
			SCALE="-vf setdar=dar=4/3"
			;;
 
		16x9 | widescreen)
			# Display aspect ratio: 16x9 widescreen
			SCALE="-vf setdar=dar=16/9"
			;;
 
		mono-left)
			# Mono audio on the left channel only
			AMAP="-map_channel 1.0.0 -map_channel 1.0.0"
			;;
 
		mono-right)
			# Mono audio on the right channel only
			AMAP="-map_channel 1.0.1 -map_channel 1.0.1"
			;;
 
		*)
			break
			;;
 
		esac
	shift
done
 
 
# --- Run FFPMEG ---
 
ffmpeg \
	-f v4l2 -thread_queue_size 256 -video_size 720x576 -i ${VDEV} \
	-f alsa -thread_queue_size 1024 -i hw:${ADEV},0 \
	$SCALE \
	$VSET \
	$ASET \
	$AMAP \
	$PRESET \
	$1

The script is run like this:

./capture.sh [options] filename.mkv

The options available are:

Internal photos and hardware specs

The PCB is labelled “EzCAP116 3.0”

Major parts on the board: