Table of Contents
Video capture on Linux
The following guide is specifically targeted to capture analog video signals.
Checklist:
- Capturing Video+Audio
- Capturing Subtitle with VBI

- Authoring subtitles

- Authoring chapters

- Lossless content encoding

- Lossy content encoding
Video path types
Composite
Y/C - S-Video
Luma and Chroma are transported on distinct wire pairs.
Recommended over Composite if your A/V equipment has no better signal to offer, especially if Digital→Analog conversion is performed onboard (e.g. LaserDisc player with digital framebuffer, D-VHS w/o Components, etc).
It's also recommended
- If your capture card has a poor comb filter (your mileage may vary, make an A/B test with your specific setup). Typical artefacts of a poor comb filter is a blurry luma, and a smudged chroma, especially if you have an OSD.
- If your video path from source to acquisition goes through processing equipment, so that losses induced by comb filters is minimized.
RGBHV
Best solution if you don't have access to Components video, when it comes to signal accuracy.
Capture hardware is scarce and expensive.
Component - YPbPr
The only way to get analog progressive scan content. The other peculiarity is you can transport HDTV content with it (up to 1080i/p).
Capture cards I've found:
- Osprey 260e with a suitable cable. Apparently supported by Linux, according to a quick search.
Alternatively, you can use a components to HDMI converter, then a digital acquisition card to process those signals.
MUSE - Hi-Vision
Best way to deal with it is getting through a MUSE decoder, then capturing the components.
Capture cards
August VGB100
| Input | Works? |
|---|---|
| Composite | Yes, OOB, (input=0) |
| S-Video | Yes, black and white only on Linux (input=1) |
| Audio | Yes, OOB |
Remarks:
VIDIOC_S_PARMioctl natively supported.- I suspect there is a signal integrity issue with this device, since I've had frequent video glitches that are unrelated to the video source (cross-tested with an Easycap DC60).
Easy Cap DC60
Sourcing: Aliexpress product page
If you have issues with this card (dmesg yelling that it's a model with the generic USB PVID), you need either to reload the kernel module with modprobe em28xx card=64, or adding options em28xx card64 to /etc/modprobe.d/easycap-em28xx.conf, but this will screw with other capture cards using the eMPIA em28xx controllers.
| Input | Works? |
|---|---|
| S-Video | Yes, OOB, in color (input=0) |
| Composite | Yes, OOB, (input=1) |
| Audio | Muted by default, need to be unmuted with v4lctl |
Remarks:
- All settings need to be preset with v4lctl, setting format and framerate with ffmpeg will fail with the following error:
ioctl(VIDIOC_S_PARM): Inappropriate ioctl for device em28xx. - Signal integrity is satisfactory, no specific remarks to add.
Monitoring video signal
You can do this in realtime using the following commands:
Display NTSC:
ffmpeg -f v4l2 -standard NTSC -video_size ntsc -framerate ntsc -i /dev/video2 -f alsa -i hw:1,0 -vcodec ayuv -acodec copy -map 0:0 -map 1:0 -f avi pipe:1 | ffplay -
Display PAL:
ffmpeg -f v4l2 -standard PAL -video_size pal -framerate pal -i /dev/video2 -f alsa -i hw:1,0 -vcodec ayuv -acodec copy -map 0:0 -map 1:0 -f avi pipe:1 | ffplay -
If your card doesn't support VIDIOC_S_PARM ioctls:
ffmpeg -f v4l2 -i /dev/video2 -f alsa -i hw:1,0 -vcodec ayuv -acodec copy -map 0:0 -map 1:0 -f avi pipe:1 | ffplay -
Capturing video signal
Unless you have a decent machine, it is recommended to first save an uncompressed capture that you will process in a second time, then compress (either losslessly for mastering/archival, or lossily for final consumption).
Authoring chapters
This can be performed using a ffmetadata file. Add the following options to insert an external metadata file:
-i example.ini -map_metadata 1
File example:
- example.ini
;FFMETADATA1 title=bike\\shed ;this is a comment artist=FFmpeg troll team [CHAPTER] TIMEBASE=1/1000 START=0 #chapter ends at 0:01:00 END=60000 title=chapter \#1 [STREAM] title=multi\ line
Doc for more info: https://ffmpeg.org/ffmpeg-formats.html#Metadata-1
Lossy content encoding
- Transparent, x264
ffmpeg -i master.avi -c:v libx264 -preset slow -crf 18 -c:a opus -b:a 192 output.mkv
- Transparent, x265
ffmpeg -i master.avi -c:v libx265 -preset slow -crf 24 -c:a opus -b:a 192 output.mkv
Additionally, you should tune the encoder by inserting -tune <option> depending on the kind of content you're encoding:
| Option | Target |
|---|---|
| film | use for high quality movie content; lowers deblocking |
| animation | good for anime and cartoons; uses higher deblocking and more reference frames |
| grain | preserves the grain structure in old, grainy film material |
| stillimage | good for slideshow-like content |
If you wish to have a smaller file, you can tune the CRF up to 28 for x264, and for x265.