The content doesn't get viewed very often because it's not easy to see what there is without watching it all. Most of the recordings consist of short clips. It would be more accessible if the clips could be extracted from the DVDs with timestamps, and mixed in with all our photos (which are also timestamped).
So I set about working out how to extract the clips with timestamps. The Camcorder supports two different disk formats for rewritable disks - VIDEO mode and VR mode, while recordable disks only support VIDEO mode. It turns out that extracting timestamped video clips is easier when using VR mode, so I'll explain that one first.
VR mode
I stumbled across a tool on the web that extracts clips from DVD-VR disks: http://www.pixelbeat.org/programs/dvd-vr/
It's a command-line program that must first be compiled from the supplied source code. Run the executable, passing the path to the .IFO and .VRO files on the DVD-VR disk, for example:
# ./dvd-vr/dvd-vr-0.9.7/dvd-vr M-leavers/VR_MANGR.IFO M-leavers/VR_MOVIE.VRO
format: DVD-VR V1.0
tv_system : PAL
resolution : 720x576
aspect_ratio: 16:9
video_format: MPEG2
audio_channs: 2
audio_coding: Dolby AC-3
Number of programs: 27
num : 1
date : 2012-08-08 12:11:05
size : 23511040
num : 2
date : 2012-08-08 12:13:30
size : 204558336
num : 3
date : 2012-08-08 12:16:36
size : 53760000
num : 4
date : 2012-08-08 12:17:31
size : 32878592
num : 5
date : 2012-08-09 10:13:58
size : 103884800
num : 6
date : 2012-08-09 10:15:30
size : 2369536
num : 7
date : 2012-08-11 10:04:54
size : 9584640
num : 8
date : 2012-08-11 10:12:03
size : 13516800
num : 9
date : 2012-08-11 10:12:57
size : 19445760
num : 10
date : 2012-08-11 10:25:03
size : 15503360
num : 11
date : 2012-08-11 10:29:44
size : 13492224
num : 12
date : 2012-08-11 10:51:46
size : 18182144
num : 13
date : 2012-08-11 10:52:11
size : 68724736
num : 14
date : 2012-08-11 11:00:29
size : 30570496
num : 15
date : 2012-08-11 11:00:59
size : 6033408
num : 16
date : 2012-08-11 11:01:18
size : 25321472
num : 17
date : 2012-08-11 14:14:48
size : 96055296
num : 18
date : 2012-08-15 09:18:56
size : 100737024
num : 19
date : 2012-08-15 09:20:37
size : 25937920
num : 20
date : 2012-08-15 09:21:05
size : 60123136
num : 21
date : 2012-08-15 09:24:37
size : 72810496
num : 22
date : 2012-08-23 09:29:27
size : 109633536
num : 23
date : 2012-08-25 11:09:01
size : 27938816
num : 24
date : 2012-08-25 11:09:43
size : 12443648
num : 25
date : 2012-08-25 11:11:41
size : 54155264
num : 26
date : 2012-08-25 11:13:04
size : 16809984
num : 27
date : 2012-08-29 14:21:29
size : 40706048
This results in a set of .vob files being created, such as "20120808_121105.vob" which contain MPEG-2 video. The filename is the datestamp of the start of the recording (i.e. in YYYYMMDD_HHMMSS format), and the file itself is datestamped the same.
VIDEO mode
This is more tricky. The camcorder creates a set of DVD menus, spread across as many "pages" as required, with an entry for each clip recorded, and the datestamps are displayed in the menu highlights. For example, here you can see the datestamp of the top-right clip in this menu screen is 12. APR. 2011, 11:07 AM:
I've found that the tcextract tool from the Ubuntu transcode package can extract the menu highlights from the DVD image as a set of bitmap images, which the subtitle2pgm tool from the subtitleripper package can convert to pgm format:
tcextract -i VIDEO_TS.VOB -x ps1 -t vob -a 0x20 | subtitle2pgm -o menu
The pamcut tool from the netpbm package can cut out specified regions of these images,
and after inverting each image with pnminvert (also from netpbm) the Optical Character Recognition (OCR) tool gocr will convert the datestamp text bitmaps into strings.
However, for some reason the tcextract command omits the first page of menu entries and starts with the second page, so the first six datestamps are missed. This is very annoying. Any ideas how I can resolve that?
Here's a script that extracts and prints the datestamps:
#!/bin/bash
# apt update && apt install transcode subtitleripper
tcextract -i VIDEO_TS.VOB -x ps1 -t vob -a 0x20 | subtitle2pgm -o menu
getdt () {
pamcut $1 $2 $3 $4 $5 |
pnminvert |
gocr - 2> /dev/null |
{
read dmy;
read hmt;
if [ "${dmy}$hmt" ]; then
y=$(echo $dmy | sed 's,\([0-9]*\)\.\([A-Z]*\)\.\([0-9]*\),\3,')
m=$(echo $dmy | sed -e 's,\([0-9]*\)\.\([A-Z]*\)\.\([0-9]*\),\2,;s,JAN,01,;s,FEB,02,;s,MAR,03,;s,APR,04,;s,MAY,05,;s,JUN,06,;s,JUL,07,;s,AUG,08,;s,SEP,09,;s,OCT,10,;s,NOV,11,;s,DEC,12,')
d=$(echo $dmy | sed 's,\([0-9]*\)\.\([A-Z]*\)\.\([0-9]*\),\1,')
chmt=$(echo $hmt | tr 'O' '0')
date '+%Y%m%d_%H%M' -d "$y-$m-$d $chmt"
else
echo "Missing"
fi;
}
}
i=1
for m in menu[0-9]*.pgm; do
echo $m > /dev/stderr
n=$(echo $m | sed 's,menu,,')
getdt 58 172 150 34 $m
getdt 242 172 150 34 $m
getdt 426 172 150 34 $m
getdt 58 346 150 34 $m
getdt 242 346 150 34 $m
getdt 426 346 150 34 $m
done | awk '
BEGIN {
n=1
}
{
if ($1 == last) {
n=n+1
} else {
n=1
}
if (n>1) {
printf "%s-%d\n", $1, n
} else {
print $1
}
last=$1
}
'
rm menu[0-9]*.pgm menu.srtx