【问题标题】:Fast data reading from CD-ROM从 CD-ROM 快速读取数据
【发布时间】:2011-01-11 22:26:30
【问题描述】:

我必须从 CD/DVDrom 中读取一个包含许多动画帧的大文件,并将其作为动画显示到屏幕上。从硬盘读取时,将一帧读入内存,处理,显示然后读取下一帧的策略效果很好,但是当我从光学设备读取时,访问时间会杀死动画。

我使用 C 和 winapi OpenFile/ReadFile 方法。

我应该如何读取存储在光学设备上的文件的内容以实现动画的实时速度(我见过一个程序甚至可以以双倍速度执行它,确保它不会在动画开始之前缓冲整个文件)?

【问题讨论】:

  • DICOM 是一种非常复杂的格式...根据分辨率和压缩选项的不同,您可能无法以足够快的速度从 CD 中进行实时播放。在这种情况下,您应该在慢动作播放和抖动之间进行选择。 DVD 不应该造成问题 - 请参阅有关相对速度和比特率的表格。

标签: c performance io cd-rom


【解决方案1】:

两种技术:

  1. 大缓冲区或高速缓存,以多 MB 为单位。 CD/DVD 具有合理的顺序 I/O,但查找/访问速度非常慢(正如您所指出的),因此重新填充缓冲区很快。您只需要足够大的缓冲区来覆盖几秒钟,以便在需要时允许磁盘启动,并在已经启动时进行查找。

  2. 多线程:保持一个线程连续读取和一个单独的线程解码动画。如果阅读器线程在解码之前太早,它应该阻塞。

这些技术适用于任何编程语言,并且可以结合使用以获得最佳效果。一个读取缓冲区和一个解码帧缓冲区可以双重保护您免受解码时间​​和访问时间的影响。

编辑: 这些是 MPlayer 使用的技术。此外,如果可以的话,你应该考虑你的编码格式——不同的格式可以在解码时牺牲 CPU 时间来减少从磁盘读取的数据。用于估计应压缩多少视频的几条信息。

  • 1x CD-ROM 的读取速度:150 kiB/s(最低速度)
  • 读取速度 4x CD-ROM:600 kiB/s(标准最小驱动器)
  • 16x CD-ROM 读取速度:1600 kiB/s(最高可达到,通常只能运行到 8x)
  • 1x DVD 驱动器读取速度:~1.3 MiB/s
  • 使用 MPEG2 以 DVD 质量压缩的标准清晰度视频:~600 kiB/s
  • 用 MPEG4 以 DVD 质量压缩的标准清晰度视频:~100 kiB/s
  • 未压缩的标清视频:~30 MB/s
  • 24 位彩色标准 1000x1000(1 兆像素)图像:3 MB
  • 8 位彩色(灰度)标准 1 兆像素图像:1 MB

Edit2:附加信息

  • 请注意,如果您的驱动器支持,通常可以以 8 倍左右的速度读取 DVD(现在大多数都支持)。
  • 动画以 24+ 帧/秒的速度开始变得流畅。在此之下,它们对观看者来说会显得生涩。
  • 无损压缩通常适用于将摄影图像的尺寸缩小约 50%。不过,您的里程可能会有所不同。
  • 动画的流畅播放部分取决于您与视频硬件的对话方式。有些方法会产生比其他方法更好的结果。在这种情况下,我强烈建议您查看 MPlayer 的代码。

【讨论】:

  • 数据应该在一些定义的数据块中读取,还是重叠io更好?
  • @bartek:重叠 IO 将绕过系统缓存,因此(可能)会更平滑,但不一定更快。
  • 非常感谢,我真的很有帮助。我不确定我是否理解“持续阅读”是什么意思,如果我用较小的 read_buffer 多次调用 ReadFile 或用较大的缓冲区调用 ReadFile 的次数是否会有所不同?我发现使用std::fstream似乎使用disc更平滑,是真的吗?
  • @Bartek:出于这些目的,您的读取方法是什么并不重要,只要它不断地从文件中拉出并馈送到单独的解码线程(可能会分成帧作为预-处理步骤)。尝试不同的读取方法,看看哪种方法的吞吐量最高。线程方法最重要的一点是您将 I/O 线程与解码分开。这意味着您的吞吐量仅受较慢步骤的限制,而不是两者的结合。对于 I/O 和 CPU 密集型的事情可能很关键。
【解决方案2】:

要尝试的一件事是压缩。例如,从驱动器加载一个 zip 文件将花费更少的时间,但需要更多的 CPU 时间来处理。如果无损压缩是可能的,那么这可能值得检查。了解 CD 驱动器也很有用。驱动器以固定的旋转速度旋转。这意味着磁盘外部上的数据加载速度比内部数据快。但是,刻录机会从内向外刻录数据,因此您可能最终不得不在“动画”之前刻录大量数据才能获得最大读取速度。

【讨论】:

  • 这是个好建议(也适用于硬盘),但如果我没看错的话,提问者对磁盘上的数据放置或动画格式没有太多控制权。我认为将光驱的读取速度与压缩视频格式的标准比特率相提并论并不是一个坏主意。
  • 更准确地说,我读了一个dicom(医学图像格式)文件,多帧图像中的数据总是逐帧存储在单个数据段中,有时是无损编码的。
  • 你能对它进行有损编码吗?你能把它放在光盘上任何你想要的地方吗?
  • 如果我是 CD 创建者,我可以,但通常我必须阅读我得到的内容,而且 IHE 对数据加密和患者 CD 有一些限制
  • 我很沮丧,因为当别人能做到的时候,我却不能取得好的成绩。我不明白 CD 驱动器 io 好。我还没试过 FILE_FLAG_SEQUENTIAL_SCAN。
【解决方案3】:

CreateFile 与 OPEN_ALWAYS 和 FILE_FLAG_SEQUENTIAL_SCAN 一起使用

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 2018-10-04
    • 1970-01-01
    • 2014-10-16
    • 2019-07-25
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多