0

情况是这样的:我的系统 (Win XP Pro) 无法从 DVD 磁盘复制一个巨大的视频文件(大约 6 gigs),这可能是有缺陷的、有划痕的或其他任何东西,但可以用 mplayer 播放几帧虽然充满马赛克。当复制过程持续一定时间时,系统会中止工作并给我这个警告“发生循环冗余校验校验和错误”。然后复制的所有内容都被自动删除。

我在想一个 Perl 应用程序可能会解决这个问题。我的想法是这样的:我一次复制一兆的视频数据。如果发生读取错误,我让 perl 忽略这一特定的一兆数据,并继续复制视频的其余部分,一次仍然是一兆。

顺便说一句,我还注意到一些商业软件可以完成这项工作,但在试验中存在局限性。

以下脚本是我迄今为止尝试过的。它一次从有缺陷的 dvd 磁盘复制数据一兆,但它像 Win XP 一样失败。唯一的区别是 perl 不会删除已经复制的内容。就我而言,它复制了大约 900 兆的视频数据到我的硬盘,这 900 兆的视频部分仍然可以用 mplayer 播放。但我的目标是复制所有好的,大多数,只留下所有不好的,少数。

    use strict;
    use warnings;

    $/ = \1_048_576;  

    open my $in, "<", 'D:\tobecopied.mkv' or die $!;
        binmode $in;
    open my $out, ">", 'E:\copied.mkv' or die $!;
        binmode $out;

    while (<$in>) {
        print $out $_;
    }

问题是我不知道如何实现这一点。希望这里有人能给我提示或线索。一如既往地感谢:)

4

1 回答 1

5

你想要ddrescue,不需要重新发明那个轮子。

readline来自您的程序的级别不够低,必须使用sysread可以指定偏移量以在部分读取失败后拾取的位置。

于 2010-07-16T15:15:27.477 回答