Recently we had some DVD’s with old family videos that had been recorded directly but never finalized, the device that recorded them then broke so it was impossible to finalize them, and it seemed to be pretty much impossible for anything else to read them. So, I figured out a way to recover them using linux…
First I installed the dvd+rw-tools
package on ubuntu and used that to get various info and prove that the DVD itself was readable even though nothing on the system could see it as a video disk or filesystem.
$ dvd+rw-mediainfo /dev/sr0 INQUIRY: [HL-DT-ST][DVDRAM GTB0N ][1.00] GET [CURRENT] CONFIGURATION: Mounted Media: 11h, DVD-R Sequential Media ID: CMC MAG. AE1 Current Write Speed: 8.0x1385=11080KB/s Write Speed #0: 8.0x1385=11080KB/s Write Speed #1: 4.0x1385=5540KB/s Speed Descriptor#0: 00/0 R@8.0x1385=11080KB/s W@8.0x1385=11080KB/s Speed Descriptor#1: 00/0 R@8.0x1385=11080KB/s W@4.0x1385=5540KB/s READ DVD STRUCTURE[#10h]: Media Book Type: 00h, DVD-ROM book [revision 0] Legacy lead-out at: 2298496*2KB=4707319808 READ DVD STRUCTURE[#0h]: Media Book Type: 25h, DVD-R book [revision 5] Last border-out at: 8390653*2KB=17184057344 READ DISC INFORMATION: Disc status: appendable Number of Sessions: 1 State of Last Session: incomplete "Next" Track: 1 Number of Tracks: 19 READ TRACK INFORMATION[#1]: Track State: reserved Track Start Address: 0*2KB Next Writable Address: 0*2KB Free Blocks: 2544*2KB Track Size: 2544*2KB READ TRACK INFORMATION[#2]: Track State: complete incremental Track Start Address: 2560*2KB Free Blocks: 0*2KB Track Size: 240*2KB Last Recorded Address: 2591*2KB
I then pulled the entire DVD into a file on the local computer for easier processing later. The command will produce lots of errors (as there are parts of the DVD that are not readable as they were never written to), but the output file (image.iso) will contain a full dump of the DVD eventually
dd if=/dev/sr0 of=image.iso bs=2048 conv=noerror,notrunc iflag=nonblock
I then put together a short perl script to search through this file for 1kb blocks beginning with the magic tag DVDVIDEO
– these seemed to be the starts of individual chapters, which avconv
(also called ffmpeg
on some distributions) can then extract into proper video/audio.
#!/usr/bin/perl use v5.16; use strict; use warnings; my $off = 0; my $file = $ARGV[0]; open my $fh, '<:bytes', $file or die; my $buf; my @pos; # Search through each block for one beginning with the header text and store these in array of offsets - I think it's one for each track while( my $len = read $fh, $buf, 1024 ) { die if $len != 1024; if( $buf =~ /^DVDVIDEO/ ) { push @pos, $off; } $off++; } push @pos, $off; my $chap = 0; for( my $i = 0; $i < @pos - 1; $i++ ) { my $length = $pos[$i+1] - $pos[$i]; next if $length < 1000; $chap++; say "dd if=$file bs=1024 skip=$pos[$i] count=$length | avconv -i - -acodec copy -vcodec copy out$chap.mp4"; }
Save that as extract_dvd_tracks.pl
and then run it to extract them as files named like out0.mp4
. Note that it won’t process tracks that are less than about 1Mb because there seemed to be a number of small sections like this which we wanted to skip over.
perl extract_dvd_tracks.pl image.iso
Job done! Note that there are probably many different formats and layouts for unfinalized DVD’s, this may be just one of many but hopefully the principle remains the same.