将DVD转换为ISO - 准确地

我一直在使用Brasero将我的DVD收藏转换成.iso文件。然而,我发现在一些DVD的播放过程中出现了一些错误,例如当播放到有问题的部分时(比如电影进行到一半),VLC播放器会停止播放iso文件。
最糟糕的是,在转换过程中没有出现任何错误或警告 - 我本可以避免这种情况。是否有一种方法或应用程序可以监测DVD/文件数据的完整性,并在未来避免这种情况?
是否有类似于Exact Audio Copier或CDparanoia的适用于DVD的工具?

3我认为音乐CD需要EAC和cdparanoia,因为CD-Audio不像DVD-Video等高级格式那样包含纠错数据。按照Neojames的建议,直接复制比特应该足够了。 - Mechanical snail
2@Mechanicalsnail 这不正确,CD的编码具有类似奇偶校验的功能,但驱动器中也有一些功能可以读取CD时准确性较低,EAC和cdparanoia会禁用或强制驱动器验证读取数据以获得准确结果。 - LiveWireBT
离题了,但是cdda2wav可以使用paranoia,并且应该优先选择。 - ustick
16个回答

我认为你可以使用dd命令来很好地复制磁盘。使用它可以轻松完成任务。
dd if=/dev/cdrom of=image_name.iso

我可以确认它在CD上运行良好,应该也能在DVD上运行良好。
编辑:我刚刚使用它来转录一张DVD,所以我可以确认它也适用于DVD。

6如果 DVD 本身有故障,我只能推荐使用 gddrescue,因为它会自动跳过无法读取的扇区(默认尝试大约三十次,如果我没记错的话,这需要很长时间,如果无法成功读取磁盘,则失败)。 - sup
1我可以确认它是有效的,后来用刻录机烧录到一张新的DVD上,它们看起来完全一样。 - Amir Uval
1@sup ddrescue 默认情况下最多尝试两次。 - landroni
9那个不起作用,出现了输入/输出错误,尽管光盘似乎没有任何问题。 - mikewhatever
7对我来说(用于DVD),使用以下命令:**sudo dd if=/dev/sr0 of=image_name.iso**。 - david6
20你应该真的使用isoinfo -d -i /dev/cdrom来找出逻辑块大小(几乎总是2048)和卷上的块数("Volume size is"行),然后将它们作为参数传递给dd命令。这样,dd命令看起来就像dd if=/dev/cdrom bs=2048 count=1621535 of=filename.iso - tgharold
8如果你不告诉dd何时停止复制,它将复制整个磁盘直到其完整大小。因此,生成的ISO映像文件将与介质本身的大小相同,而不是介质上数据的大小。换句话说,如果你有一个只有1GB数据的DVD,你的ISO文件将是4.7GB(或更多)的大小。如果你像@tgharold提到的那样给dd一个块大小和计数,生成的ISO文件将只有足以容纳介质上数据的大小。 - Dan Moulding
isoinfo中的count值是不明确的。因此,您可以忽略它,只需执行dd if=/dev/cdrom bs=2048 of=out.iso命令,dd会在达到光盘末尾时停止。 - transang
2如果DVD受到复制保护,你需要在VLC中安装libdvdcss,并在开始尝试提取之前在VLC中加载它,否则你的DVD驱动器可能会拒绝提取。 - 0x777C
@transang,你能解释一下吗:为什么isoinfo的计数输出不明确?你是指它在到达光盘的末尾还是内容的末尾时停止?也就是说,它总是4.7GB吗? - Matthias
@Matthias实际上,我的评论有些含糊不清。一些CD/DVD是使用填充(cdrecord -padcdrecord -padsize=63s 链接)来减轻ISO-9660中的预读缓冲区。isoinfo返回的光盘大小不包括填充部分,导致复制的文件与原始光盘不同(校验和将失败)。如果在dd中省略count参数,它将复制到光盘末尾,包括填充部分链接 - transang
@transang 所以你的意思是,如果你从 isoinfo 传递一个 countdd,就有可能出现不准确的副本风险? - Matthias
在某种意义上,是的。确切地说,如果您使用不正确的“count”,您将无法确认副本的正确性。dd在复制后不进行校验和检查。在实践中,建议使用校验和,特别是当数据源/目标是CD/DVD时。如果isoinfo返回不正确的“count”,校验和将始终失败,从而使校验和的目的失效。 - transang

我还没有找到一个指向我认为是正确答案的链接。大多数只是说DD CD/DVD。但是媒体末尾有额外的填充可能会导致错误。
我还应该指出,这对大多数情况都适用,但我在使用索尼CSS/CPPM保护时遇到了问题,我使用另一个程序来实现所需的结果。
总之,我发现以下方法非常适合我...:
  1. 获取正在复制的CD/DVD的信息。我还没有尝试过音频CD,因为我只是将它们转换成flac文件,但以下是对DVD进行的测试。

    # isoinfo -d -i /dev/sr1 | grep -i -E 'block size|volume size'
    逻辑块大小为:2048
    卷大小为:2264834
    

    我们使用逻辑块大小作为BS=变量,使用卷大小作为COUNT=变量

  2. 使用DD将DVD复制到ISO文件:

    # dd if=/dev/sr1 of=/mnt/incoming/test.iso bs=2048 count=2264834
    2264834+0 records in
    2264834+0 records out
    4638380032 bytes (4.6 GB, 4.3 GiB) copied, 373.405 s, 12.4 MB/s
    

    监视 dd 进度的一种替代方法是添加status=progress

  3. 对比图像和实际DVD。

    # md5sum /mnt/incoming/test.iso 
    d3a2cdd58b8c9ade05786526a4a8eae2  /mnt/incoming/test.iso
    
    # md5sum /dev/sr1
    d3a2cdd58b8c9ade05786526a4a8eae2  /dev/sr1
    
希望这能帮助到需要一个完整答案的人。

2isosize -x /dev/sr0 这个命令也可以用来获取信息。 - Tony
2给自己的备忘:在dd命令行中加入status=progress以便查看详细的进度通知。 - Marecky

使用dvdbackup。
以下是如何完整复制DVD的步骤:
dvdbackup -i /dev/dvd -o ~ -M

将DVD内容放入您的主目录(~)的新子目录中。然后使用以下命令生成.iso文件:
mkisofs -dvd-video -udf -o ~/dvd.iso ~/[movie_name]

如果你愿意,你也可以只提取主要功能(参见archlinuxsourceforge文档)。如果你想要一个视频文件(例如.m4v)而不是.iso文件,在提取整个DVD后使用handbrake(别忘了安装libdvdcss!)。
有一些方法可以减少步骤的数量,但这种方法似乎比其他选择更可靠。
我对archlinux文档特别满意。
附言:我怀疑大多数答案在撰写时都很出色,但我发现它们在我撰写本答案时并没有帮助,所以我想写一个对我有效的答案,以防其他人在我发现这个问题的同时也在寻找答案。

dvdbackup在我尝试转录的多张DVD上出现了错误("libdvdread: CHECK_VALUE failed in ...")。它对一些DVD有效,但并非所有DVD都适用。 - cweiske

你有几个选择,在GNOME中都能很好地工作:
  • AcidRip 安装acidrip 是一个使用Perl编写的自动化前端工具,用于MPlayer/Mencoder(使用mplayer和mencoder进行DVD转码和编码)。它使用Gtk2::Perl提供图形界面。只需点击一个按钮即可对DVD进行编码。

    sudo apt install acidrip
    
  • dvd-rip 安装dvdrip 是一个功能齐全的DVD复制程序,使用Perl编写,是transcode和ffmpeg的前端。它提供了一个易于使用但功能丰富的Gtk+ GUI,可以控制几乎所有的转码和复制过程。

    它使用广为人知的视频处理工具transcode和许多其他开源工具。dvd::rip本身在GPL / Perl Artistic License下获得许可。您可以按照以下步骤在Debian / Ubuntu Linux上安装dvd::rip:

    sudo apt install dvdrip
    
  • K9copy 安装k9copy 是一个KDE DVD备份工具。它允许将DVD9复制到DVD5。它也被称为Linux DVD压缩工具。它支持以下功能:将视频流压缩以适应4.7GB可记录的DVD。DVD刻录。创建ISO映像。选择要复制的音频和字幕轨道。标题预览(仅限视频)。保留原始菜单的能力。

    sudo apt install k9copy
    

13没有一款能够像原问题所要求的那样将它们转换为ISO格式。 - Dave
1k9copy曾经可以实现这个功能,但是它在Ubuntu软件仓库中已不再可用。 - Joey Adams
同样,acidrip也不行。 :-( - tudor -Reinstate Monica-
@JoeyAdams: K9Copy应该在Ubuntu多元宇宙存储库中可用。 - basic6

Brasero能够准确地复制DVD。您首先需要从VLC网站安装“libdvdcss2”。这样可以让Brasero绕过商业DVD中使用的“CSS”(内容加密系统),以防止未经授权的复制。

3这可能是一个愚蠢的问题,但是你能在不解密的情况下复制一张DVD吗?基本上就是制作一份原始副本,其中副本也是加密的光盘? - thomasrutter
2@thomasrutter 没有愚蠢的问题。但答案是否定的。至少不是没有自己制作DVD的情况下。密钥算法的一部分使用的信息是预设的,即使在可写DVD上也是如此。 - Perkins
@thomasrutter,是的,你可以。这里列出的所有位拷贝方法,比如ddddrescue,都可以做到这一点。 - Adrian
2@Adrian 上面的评论表明这是不可能的,因为加密是在较低的层次上完成的,即使你能够做到,数据也是无用的,因为解密需要预先嵌入光盘中但不作为光盘数据的一部分被读取或复制的信息。 - thomasrutter
@thomasrutter所以你是说按位复制实际上是加密下的位的副本吗? - Adrian

如果遇到强大或奇怪的反复制保护,并且这张DVD是你自己的,你应该先解密DVD,然后执行一个容错的副本。
安装依赖项:
$ sudo apt install libdvd-pkg && sudo dpkg-reconfigure libdvd-pkg
$ sudo apt install mplayer gddrescue

解密您的DVD(假设设备文件为/dev/sr0):
$ mplayer -dvd-device /dev/sr0 dvd:// -vo null -ao null -ss 10 -endpos 1

创建图像:
$ ddrescue -n -b 2048 /dev/sr0 title.iso title.log

你可以稍后处理图像文件"title.iso"。如果有任何乱码内容,ddrescue应该已经跳过了。

这是唯一一个能正确破解带有拷贝保护的DVD的答案;dd和其他工具无法正常工作。我使用的是Ubuntu 16.04(是的,一个旧版本的发行版,但它是我唯一一台带有DVD播放器的设备上安装的)。 - Taylor R

试试使用ddrescue。我能够成功地通过以下命令从cygwin命令提示符中对我的DVD进行位拷贝:
ddrescue --no-scrape /dev/scd0 backup.iso

在其他变种的*inx上可以使用类似的命令。当然,您需要根据适当的安装应用程序为您的*inx版本下载ddrescue。请参阅您的*inx帮助页面以获取详细信息。

有没有类似Exact Audio Copier或CDparanoia的DVD版本呢?
dvdisaster可以进行多次读取,如果某个扇区损坏,就相当于CDparanoia。以下是使用示例:
dvdisaster -d /dev/sr0 -i /path/to/output.iso --read-raw -r --read-attempts 5-20

它在Ubuntu的宇宙仓库中。

Handbrake在当前所有支持的Ubuntu版本的默认存储库中。要安装它,请打开终端并输入以下命令:
sudo apt install handbrake  

要安装Handbrake的CLI版本,请打开终端并输入以下命令:
sudo apt install handbrake-cli

通常,snap find handbrake 的结果会显示手刹的最新稳定版本是 handbrake-jz。要安装这个手刹的 snap 包,请运行以下命令:
sudo snap install handbrake-jz

如何使用HandBrake来转换DVD

  1. 打开HandBrake。
  2. 通过选择文件 -> 打开单个标题来选择要转换的文件。
  3. 点击右下角To:旁边的向下三角形▼,浏览到目标保存文件的目录。
  4. 点击顶部的绿色开始图标开始转换DVD。

mkisofs -r -o file.iso /dev/cdrom

这只是一个例子,随时可以查看mkisofs --help来查看所有其他选项。

1这个命令对我不起作用。它返回:I: -input-charset未指定,使用utf-8(在区域设置中检测到) 总翻译表大小:0 总rockridge属性字节:264 总目录字节:0 路径表大小(字节):10 最大brk空间使用量为0 写入175个范围(0 MB) - PHP Learner
或许在命令后面加上“-l”可以帮助解决问题... - DJCrashdummy