- https://askubuntu.com/questions/348838/how-to-check-available-webcams-from-the-command-line
- https://www.linuxtv.org/wiki/index.php/Saa7134-alsa
- https://www.linuxtv.org/wiki/index.php/Philips_SAA7134
- https://www.linuxtv.org/wiki/index.php/Saa713x_devices
- https://www.linuxtv.org/wiki/index.php/Saa713x_devices:_Generic_SAA7134_Card_Installation
- https://trac.ffmpeg.org/wiki/Capture/ALSA
- https://video.stackexchange.com/questions/33387/vhs-and-capture-what-is-the-real-aspect-ratio
- https://en.wikipedia.org/wiki/Pixel_aspect_ratio
- https://en.wikipedia.org/wiki/List_of_common_resolutions#Analog_systems
- https://en.wikipedia.org/wiki/VHS
- https://tvtime.sourceforge.net/cards.html#saa7134
- https://www.linuxtv.org/downloads/v4l-dvb-apis/admin-guide/saa7134-cardlist.html?highlight=saa713
- https://github.com/torvalds/linux/blob/master/drivers/media/pci/saa7134/saa7134-video.c
- https://www.linuxtv.org/wiki/index.php/V4L_capturing
- https://www.linuxtv.org/wiki/index.php/V4L_capturing/script
- ffmpeg
- alsa-utils
- v4l-utils
- gstreamer1.0-tools
- gstreamer1.0-plugins-good
- gstreamer1.0-alsa
- Create a file at
/etc/modprobe.d/saa7134.confwith the following contents:alias char-major-81 videodev alias char-major-81-0 saa7134 options saa7134 card=109- The card number (109 in this example) is one of these: https://www.linuxtv.org/downloads/v4l-dvb-apis/admin-guide/saa7134-cardlist.html?highlight=saa713 .
- Mine is a Gigabyte card with a Philips chip, and it said something about a "tiger" on the box, so I guessed it must be "Philips Tiger - S Reference design" in that table, which is 109. It worked.
- Experiment with different card numbers (rebooting in between changes) until
v4l2-ctl --list-inputsgives you a sensible output.
- Reboot.
lspci03:01.0 Multimedia controller: Philips Semiconductors SAA7131/SAA7133/SAA7135 Video Broadcast Decoder (rev d1)
v4l2-ctl --list-inputsioctl: VIDIOC_ENUMINPUT
Input : 0
Name : Television
Type : 0x00000001 (Tuner)
Audioset : 0x00000000
Tuner : 0x00000000
Standard : 0x0000000000FFBFFF (PAL-B/B1/G/H/I/D/D1/K/M/N/Nc/60 NTSC-M/M-JP/M-KR SECAM-B/D/G/H/K/K1/L/Lc)
Status : 0x00000102 (no signal, no hsync lock)
Capabilities: 0x00000004 (SDTV standards)
Input : 1
Name : Composite1
Type : 0x00000002 (Camera)
Audioset : 0x00000000
Tuner : 0x00000000
Standard : 0x0000000000FFBFFF (PAL-B/B1/G/H/I/D/D1/K/M/N/Nc/60 NTSC-M/M-JP/M-KR SECAM-B/D/G/H/K/K1/L/Lc)
Status : 0x00000000 (ok)
Capabilities: 0x00000004 (SDTV standards)
Input : 2
Name : S-Video
Type : 0x00000002 (Camera)
Audioset : 0x00000000
Tuner : 0x00000000
Standard : 0x0000000000FFBFFF (PAL-B/B1/G/H/I/D/D1/K/M/N/Nc/60 NTSC-M/M-JP/M-KR SECAM-B/D/G/H/K/K1/L/Lc)
Status : 0x00000000 (ok)
Capabilities: 0x00000004 (SDTV standards)
v4l2-ctl --list-formats-extioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'GREY' (8-bit Greyscale)
[1]: 'RGBO' (16-bit A/XRGB 1-5-5-5)
[2]: 'RGBQ' (16-bit A/XRGB 1-5-5-5 BE)
[3]: 'RGBP' (16-bit RGB 5-6-5)
[4]: 'RGBR' (16-bit RGB 5-6-5 BE)
[5]: 'BGR3' (24-bit BGR 8-8-8)
[6]: 'RGB3' (24-bit RGB 8-8-8)
[7]: 'BGR4' (32-bit BGRA/X 8-8-8-8)
[8]: 'RGB4' (32-bit A/XRGB 8-8-8-8)
[9]: 'YUYV' (YUYV 4:2:2)
[10]: 'UYVY' (UYVY 4:2:2)
[11]: '422P' (Planar YUV 4:2:2)
[12]: 'YU12' (Planar YUV 4:2:0)
[13]: 'YV12' (Planar YVU 4:2:0)
v4l2-ctl --allDriver Info:
Driver name : saa7134
Card type : Philips Tiger - S Reference des
Bus info : PCI:0000:03:01.0
Driver version : 6.1.55
Capabilities : 0x85250015
Video Capture
Video Overlay
VBI Capture
Tuner
Radio
Read/Write
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x05210005
Video Capture
Video Overlay
Tuner
Read/Write
Streaming
Extended Pix Format
Media Driver Info:
Driver name : saa7134
Model : saa7133[0]
Serial :
Bus info : PCI:0000:03:01.0
Media version : 6.1.55
Hardware revision: 0x14589003 (341348355)
Driver version : 6.1.55
Interface Info:
ID : 0x03000006
Type : V4L Video
Entity Info:
ID : 0x00000005 (5)
Name : saa7133[0] video (Philips Tiger
Function : V4L2 I/O
Pad 0x0100000f : 0: Sink
Link 0x0200001b: from remote pad 0x100000e of entity 'saa713x' (Analog Video Decoder): Data, Enabled
Priority: 2
Frequency for tuner 0: 0 (0.000000 MHz)
Tuner 0:
Name : Television
Type : Analog TV
Capabilities : 62.5 kHz multi-standard stereo lang1 lang2 freq-bands
Frequency range : 44.000 MHz - 958.000 MHz
Signal strength/AFC : 0%/0
Current audio mode : mono
Available subchannels: mono
Video input : 0 (Television: no signal, no hsync lock)
Video Standard = 0x000000ff
PAL-B/B1/G/H/I/D/D1/K
Format Video Capture:
Width/Height : 720/576
Pixel Format : 'BGR3' (24-bit BGR 8-8-8)
Field : Interlaced
Bytes per Line : 2160
Size Image : 1244160
Colorspace : SMPTE 170M
Transfer Function : Default (maps to Rec. 709)
YCbCr/HSV Encoding: Default (maps to ITU-R 601)
Quantization : Default (maps to Full Range)
Flags :
Format Video Overlay:
Left/Top : 0/0
Width/Height: 720/576
Field : Interlaced
Chroma Key : 0x00000000
Global Alpha: 0x00
Clip Count : 0
Clip Bitmap : No
Framebuffer Format:
Capability : Clipping List
Flags :
Width : 720
Height : 576
Pixel Format : 'BGR3'
Bytes per Line: 0
Size image : 0
Colorspace : SMPTE 170M
Crop Capability Video Capture:
Bounds : Left 0, Top 48, Width 720, Height 576
Default : Left 0, Top 48, Width 720, Height 576
Pixel Aspect: 54/59
Selection Video Capture: crop, Left 0, Top 48, Width 720, Height 576, Flags:
Selection Video Capture: crop_default, Left 0, Top 48, Width 720, Height 576, Flags:
Selection Video Capture: crop_bounds, Left 0, Top 48, Width 720, Height 576, Flags:
Streaming Parameters Video Capture:
Frames per second: 25.000 (25/1)
Read buffers : 2
User Controls
brightness 0x00980900 (int) : min=0 max=255 step=1 default=128 value=128 flags=slider
contrast 0x00980901 (int) : min=0 max=127 step=1 default=68 value=68 flags=slider
saturation 0x00980902 (int) : min=0 max=127 step=1 default=64 value=64 flags=slider
hue 0x00980903 (int) : min=-128 max=127 step=1 default=0 value=0 flags=slider
volume 0x00980905 (int) : min=-15 max=15 step=1 default=0 value=0 flags=slider
mute 0x00980909 (bool) : default=0 value=0
horizontal_flip 0x00980914 (bool) : default=0 value=0
invert 0x00981960 (bool) : default=0 value=0
y_offset_odd_field 0x00981961 (int) : min=0 max=128 step=1 default=0 value=0
y_offset_even_field 0x00981962 (int) : min=0 max=128 step=1 default=0 value=0
automute 0x00981963 (bool) : default=1 value=1
arecord -lcard 1: SAA7134 [SAA7134], device 0: SAA7134 PCM [SAA7134 PCM]
Subdevices: 1/1
Subdevice #0: subdevice #0
ffmpeg -f v4l2 -list_formats all -i /dev/video0[video4linux2,v4l2 @ 0x1554e80] Raw : gray : 8-bit Greyscale :
[video4linux2,v4l2 @ 0x1554e80] Raw : rgb555le : 16-bit A/XRGB 1-5-5-5 :
[video4linux2,v4l2 @ 0x1554e80] Raw : rgb555be : 16-bit A/XRGB 1-5-5-5 BE :
[video4linux2,v4l2 @ 0x1554e80] Raw : rgb565le : 16-bit RGB 5-6-5 :
[video4linux2,v4l2 @ 0x1554e80] Raw : rgb565be : 16-bit RGB 5-6-5 BE :
[video4linux2,v4l2 @ 0x1554e80] Raw : bgr24 : 24-bit BGR 8-8-8 :
[video4linux2,v4l2 @ 0x1554e80] Raw : rgb24 : 24-bit RGB 8-8-8 :
[video4linux2,v4l2 @ 0x1554e80] Raw : bgr0 : 32-bit BGRA/X 8-8-8-8 :
[video4linux2,v4l2 @ 0x1554e80] Raw : 0rgb : 32-bit A/XRGB 8-8-8-8 :
[video4linux2,v4l2 @ 0x1554e80] Raw : yuyv422 : YUYV 4:2:2 :
[video4linux2,v4l2 @ 0x1554e80] Raw : uyvy422 : UYVY 4:2:2 :
[video4linux2,v4l2 @ 0x1554e80] Raw : yuv422p : Planar YUV 4:2:2 :
[video4linux2,v4l2 @ 0x1554e80] Raw : yuv420p : Planar YUV 4:2:0 :
[video4linux2,v4l2 @ 0x1554e80] Raw : yuv420p : Planar YVU 4:2:0 :
ffprobe /dev/video0Intersting: This is the only one showing the resolution!
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 2546.446776, bitrate: 124416 kb/s
Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 720x576, 124416 kb/s, 25 fps, 25 tbr, 1000k tbn
ffprobe -f alsa hw:1Note the hw:N here. This is what we will use for ffmpeg's -i option.
Input #0, alsa, from 'hw:1':
Duration: N/A, start: 1699123043.658554, bitrate: 1024 kb/s
Stream #0:0: Audio: pcm_s16le, 32000 Hz, 2 channels, s16, 1024 kb/s
When capturing directly using ffmpeg, I could only get "progressive interleaved" video. Interleaving is a very naive deinterlacing algorithm: It simply combines two frames into one by using the odd rows from one and the even rows from the next. This produces a lot of visual artifacts.
It's better to capture the interlaced video directly (see capture_gstreamer_raw.sh) and run it through a more advanced deinterlacing filter like nnedi.
Capture using Gstreamer, without worrying about quality or synchronization.
Low latency is the top priority here.
Use mpv for playback, which works even without installing a desktop environment.
See watch.sh below.
tail -f tmp.mkv | ffmpeg -i - -f mpegts - | mpv -