我必须读取一个包含CD/DVDROM中许多动画帧的大文件,并以动画形式显示在屏幕中。从硬盘读取时,将框架读取为内存,处理,显示和读取下一帧的策略效果很好,但是当我从光学设备阅读时,访问时间会杀死动画。

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

我应该如何读取存储在光学设备上的文件的内容以实现动画的实时速度(我已经看到了一个程序,即使以双倍的速度进行操作,可以肯定的是它不会在动画启动之前缓冲整个文件)?

有帮助吗?

解决方案

两种技术:

  1. 大型缓冲或缓存,如多个MB。 CD/DVD具有合理的顺序I/O,但是非常缓慢的寻求/访问速度(如您所指出的那样),因此对缓冲区进行补充是快速的。您只需要足够大的缓冲区,以至于它覆盖了几秒钟即可使磁盘在需要时旋转,并在已经旋转时寻求磁盘。

  2. 多线程:保持一个线程连续读取和单独的线程解码动画。如果读者线程在解码方面太远,则应阻止。

这些技术适用于任何编程语言,并且可以合并以获得最佳效果。一个读数缓冲区和一个解码的框架缓冲区还可以保护您两次,以防止解码时间和访问时间。

编辑:这些是mplayer用途的技术。此外,如果可以的话,您应该考虑您的编码格式 - 不同格式可以在解码中以更少的数据来换取CPU时间以从磁盘上读取。一些信息,用于估计应压缩多少视频。

  • 读取1倍CD-ROM的速度:150 KIB/S(裸速度)
  • 读取速度4x CD-ROM:600 KIB/S(标准最小驱动器)
  • 读取速度16倍CD-ROM:1600 KIB/S(最大可获得,通常仅运行8倍)
  • 读取速度1x DVD驱动器:〜1.3 MIB/S
  • 标准定义视频在DVD质量上被MPEG2压缩:〜600 kib/s
  • 用DVD质量压缩的标准定义视频:〜100 kib/s
  • 未压缩标准定义视频:〜30 MB/s
  • 标准1000x1000(1百万像素)以24位颜色:3 MB
  • 标准1兆像素的图像在8位颜色(灰度):1 MB

Edit2:其他信息

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

其他提示

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

利用 CreateFile 使用open_always和file_flag_secerential_scan

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top