从CD-ROM读取快速数据

时间:2010-02-01 22:15:43

标签: c performance io cd-rom

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

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

我应该如何读取存储在光学设备上的文件内容以实现动画的实时速度(我已经看过一个程序即使在双倍速度下也可以,但是在动画开始之前它不会缓冲整个文件)?

3 个答案:

答案 0 :(得分:4)

两种技巧:

  1. LARGE缓冲区或缓存,与多个MB一样。 CD / DVD具有合理的顺序I / O,但搜索/访问速度非常慢(如您所知),因此重新填充缓冲区的速度很快。你只需要缓冲区足够大,它可以覆盖几秒钟,以便在需要时让磁盘旋转起来,并在已经旋转的情况下进行搜索。

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

  3. 这些技术适用于任何编程语言,并且可以组合以获得最佳效果。一个读取缓冲区和一个解码帧缓冲区可以保护您两倍的解码时间和访问时间。

    修改 这些是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
    • 标准1000x1000(100万像素)24位色彩图像:3 MB
    • 标准的100万像素图像,8位色(灰度):1 MB

    编辑2:其他信息

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

使用CreateFile与OPEN_ALWAYS和FILE_FLAG_SEQUENTIAL_SCAN