2

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

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

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

4

3 回答 3

4

两种技术:

  1. LARGE 缓冲区或缓存,如多个 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
  • 标准 1000x1000(1 兆像素)图像,24 位颜色:3 MB
  • 标准 1 兆像素图像,8 位彩色(灰度):1 MB

编辑2:附加信息

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

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

于 2010-02-01T22:21:00.397 回答
0

使用带有 OPEN_ALWAYS 和 FILE_FLAG_SEQUENTIAL_SCAN 的CreateFile

于 2010-02-01T22:22:38.700 回答