Site Map - skip to main content

Hacker Public Radio

Your ideas, projects, opinions - podcasted.

New episodes every weekday Monday through Friday.
This page was generated by The HPR Robot at


hpr4185 :: Archiving VCR or any other RCA media

VCR players are starting to get expensive so now is the time to archive.

<< First, < Previous, , Latest >>

Thumbnail of Ken Fallon
Hosted by Ken Fallon on 2024-08-16 is flagged as Clean and is released under a CC-BY-SA license.
VCR, Archive, RSA, HDMI, USB, ffmpeg, video4linux, alsa, timeout, losslesscut. 2.
The show is available on the Internet Archive at: https://archive.org/details/hpr4185

Listen in ogg, spx, or mp3 format. Play now:

Duration: 00:17:15

general.

Archiving VCR or any other RCA media

After my Father passed away, I volunteered to archive his Video Cassette Recorder (VCR) collection to disk for the family. You might be aware that Europe used Phase Alternating Line (PAL) is a colour encoding system for analog television. It was one of three major analogue colour television standards, the others being NTSC and SECAM.

Ireland used PAL-I, a version based on CCIR System I, which meant that none of the VCR players in the Netherlands would work. So in addition to having to carry 113 Video Cassettes on a RyanAir Flight, I also needed to bring the Video Player as well.

Hardware

These are the ones I used but I don't recommend them one way or the other. The parts are fairly generic so use what you can get.

The setup showing VCR to RSA to HDMI to USB

Connection

First drop to a console and list the connected usb devices

$ lsusb | sort | tee before.txt

  • Connect the VCR with RSA Cables to the AV2HDMI converter.
  • Connect the AV2HDMI converter with a HDMI cable to the HDMI2USB converter.
  • Connect the HDMI2USB converter to a Linux PC with a usb cable.

After waiting a few seconds, you can list the usb devices again and do a diff to see which has been added.

$ lsusb | sort | tee after.txt
$ diff before.txt after.txt
11a12
> Bus 003 Device 021: ID 534d:2109 MacroSilicon USB Video

While we know the USB device ID, we now need to know if/how the hardware is mapped into Linux.

We need a way to be able to identify which /dev/video? device I need to capture from.

First unplug the HDMI2USB capture card, and get a list of the video devices.

$ for i in  /sys/class/video4linux/video*/device/uevent ;do echo "${i} ===";cat "${i}";done | tee before.txt

Plug back in the card and give it a few seconds to be recognised. Then run the same command and diff the output to see the differences.

$ for i in  /sys/class/video4linux/video*/device/uevent ;do echo "${i} ===";cat "${i}";done | tee after.txt
$ diff before.txt after.txt
28a29,42
> /sys/class/video4linux/video4/device/uevent ===
> DEVTYPE=usb_interface
> DRIVER=uvcvideo
> PRODUCT=534d/2109/2100
> TYPE=239/2/1
> INTERFACE=14/1/0
> MODALIAS=usb:v534Dp2109d2100dcEFdsc02dp01ic0Eisc01ip00in00
> /sys/class/video4linux/video5/device/uevent ===
> DEVTYPE=usb_interface
> DRIVER=uvcvideo
> PRODUCT=534d/2109/2100
> TYPE=239/2/1
> INTERFACE=14/1/0
> MODALIAS=usb:v534Dp2109d2100dcEFdsc02dp01ic0Eisc01ip00in00

In my case I'm interested in the PRODUCT=534d/2109/2100. From which we can find the changing path, which in this case is /sys/class/video4linux/video5/

Similarly we also need to know which ALSA Audio Device it exposed.

Again unplug the HDMI2USB capture card, and get a list of the audio devices.

$ arecord -l | tee before.txt

Plug back in the card and give it a few seconds to be recognised. Then run the same command and diff the output to see the differences.

$ arecord -l | tee after.txt
$ diff before.txt after.txt
7a8,10
> card 2: MS2109 [MS2109], device 0: USB Audio [USB Audio]
>   Subdevices: 1/1
>   Subdevice #0: subdevice #0

In my case it reports as MS2109 from which we can find the changing card 2

Software

Due to the limitations of this brand of video capture we need to force capture to use mjpg format at 30 frames per second.

I first used vlc to test the capture

Select Open Media > Capture Devices Select Video Device Name to the video device you found above. So as an example /dev/video4 Also set the "Audio device name" to the alsa card, eg hw: 2,0:

Screenshot of menu detailed above

Once audio and video were working, I switched to using ffmpeg as I'm more comfortable scripting with it.

Bash script

This is very much a "me" script, so edit it to your hardware and requirements.

#!/bin/bash

Copyright Ken Fallon 2024 (c) "No Rights Reserved"
Released to the Public Domain via Creative Commons 0
https://creativecommons.org/public-domain/cc0/

video_device="$( grep -l 'PRODUCT=534d/2109/2100' /sys/class/video4linux/video*/device/uevent | \
head -1 | \
awk -F '/' '{print $5}' )"
video_device_path="/dev/${video_device}"
if [ -z "${video_device}" ]
then
  echo "ERROR: Cannot find the HDMP2USB stick video stream" 1>&2
  exit 1
else
  echo "INFO: Found the HDMP2USB stick video on \"${video_device_path}\"" 1>&2
fi

audio_device_id="$( arecord -l | grep 'MS2109' | awk -F 'card |:' '{print $2}' )"
if [ -z "${audio_device_id}" ]
then
  echo "ERROR: Cannot find the HDMP2USB stick audio stream" 1>&2
  exit 1
else
  echo "INFO: Found the HDMP2USB stick audio on \"${audio_device_id}\"" 1>&2
fi

ffmpeg \
-f v4l2 \
-framerate 30 \
-video_size 720x480 \
-input_format mjpeg \
-thread_queue_size 512 \
-i "${video_device_path}" \
-f alsa \
-i hw:"${audio_device_id}" \
-c:v copy \
-c:a flac \
output-flac.mkv

The break down of the ffmpeg options are as follows, for more information see man ffmpeg or view online man pages.

SYNOPSIS
ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...

-f fmt (input/output)
    Force input or output file format. The format is normally auto detected for input files and guessed from
    the file extension for output files, so this option is not needed in most cases.

-framerate
    Set the grabbing frame rate. Default is "ntsc", corresponding to a frame rate of "30000/1001".

-video_size
    Set the video frame size.

-input_format
    Set the preferred pixel format (for raw video) or a codec name. This option allows one to select the input
    format, when several are available.

-thread_queue_size size (input)
    This option sets the maximum number of queued packets when reading from the file or device. With low
    latency / high rate live streams, packets may be discarded if they are not read in a timely manner;
    raising this value can avoid it.

-i filename (input)
    input file name

-f fmt (input/output)
    Force input or output file format. The format is normally auto detected for input files and guessed from
    the file extension for output files, so this option is not needed in most cases.

-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
    Select an encoder (when used before an output file) or a decoder (when used before an input file) for one
    or more streams. codec is the name of a decoder/encoder or a special value "copy" (output only) to indicate
    that the stream is not to be re-encoded.

    For example

            ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

    encodes all video streams with libx264 and copies all audio streams.

    For each stream, the last matching "c" option is applied, so

            ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

    will copy all the streams except the second video, which will be encoded with libx264, and the 138th audio,
    which will be encoded with libvorbis.

We used the v4l2 for the Video4Linux format. A frame rate of 30, and input format of mjpg which are limitations of the card. Given the source PAL-I has 625 lines, a video_size of 720x480 is reasonable. After ffmpeg complained, I added thread_queue_size of 512 to help out. Then the rest is specifying the input for the video, and setting the audio to flac.

I just want to dump the incoming stream to a file so that it can be processed later.

Recording

for vcr in {0..113}; do ;-)

The intention was to put in a tape in the morning before going to work. Swap it for another when I got home, and yet another when I went to bed.

As there was no mechanism to know when the recording was done, I first checked the length of the tape by Fast Forwarding it to the end.

I used the timeout command to run a command with a time limit

This would prevent already massive files filling the disk with hours of static.

timeout --preserve-status --kill-after=5m --verbose 210m record-720x480.bash

Problems

While it worked fine for some, there was an intermittent problem that would cause the laptop to freeze. It would eventually recover after a few days, but I lost a lot of time and couldn't trust the process. I checked the memory and hard disk, even writing to usb and a nas.

With each hour of recording coming in at 6.6G, some tapes lead to 60G files.

I suspect that my luks encrypted disk was struggled with the huge files that were been produced.

So keeping it simple I called out my HP t610 Flexible Thin Client with 2nd hand 1T hard disk, and set it up with a clean install of Debian.

This fixed the issue and allowed me to get consistent recordings, all be it in a not so handy format.

Post processing

I wanted to be able to scrubb forward and back, to see if there was anything recorded on the tapes. Unfortunately the mkv flac/mjpeg format doesn't allow scrubbing, so the recorded media first needed to be transcoded to a format that did allow scrubbing, but also reduced the file size dramatically.

By specifying the filename as next this command converted the media to mp4. ffmpeg -i ${next} ${next%.*}.mp4

This reduces the size by about 50%.

Once converted this allowed me to use LosslessCut The Swiss Army Knife of Lossless Video/Audio Editing, to quickly preview and cut out the sections I needed without having to reprocess everything.

flatpak run no.mifi.losslesscut

The following are the links I gathered while compiling this project. Most are from searching for the usb id into a search engine "534d:2109".


Comments

Subscribe to the comments RSS feed.

Comment #1 posted on 2024-08-21 22:00:56 by Trixter

Some issues with your capture methodology

If you captured PAL at 720x480 30fps, you've done it wrong -- those are NTSC standards. Your capture hardware and software should have provided an option to capture 720x576 at 25fps.

I didn't notice anything regarding handling deinterlacing. For proper viewing of PAL material, you want to deinterlace to 50p or 50 output frames per second, which the ffmpeg filter bwdif can do very well.

Comment #2 posted on 2024-08-22 14:10:38 by Ken Fallon

Trixter

You are correct but the whole point of these devices is that they are mass produced to do all that for you. You don't need to configure anything. What you get out is "(MJPEG) 1080P 30FPS" 720x480 is scaling the output MJEPG 1080p down not the source file.

For why see https://www.youtube.com/watch?v=ZC5Zr3NC2PY

Leave Comment

Note to Verbose Commenters
If you can't fit everything you want to say in the comment below then you really should record a response show instead.

Note to Spammers
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to record a show about yourself, or your industry, or any other topic we may find interesting. We also check shows for spam :).

Provide feedback
Your Name/Handle:
Title:
Comment:
Anti Spam Question: What does the letter P in HPR stand for?
Are you a spammer?
Who is the host of this show?
What does HPR mean to you?