背景
我有一个从光盘播放视频文件的应用程序。当我第一次播放这些文件时,文件读取有时会滞后。但是,它第二次播放时从来没有任何延迟,我怀疑这是因为文件在第一次播放时被放入windows文件缓存中。
我的应用程序的要求是它应该能够随时播放任何视频(同一视频几乎从不播放两次,因此不需要缓存),这使得当前的问题非常关键。
为了调试这个问题,我需要禁用windows xp文件缓存。
问题
有没有办法禁用windows xp文件缓存?
编辑/更多信息
我使用ffmpeg,无法访问实际的文件读取调用。即使之前播放了其他几个文件(预热),也会出现此问题。
答案 0 :(得分:3)
一般来说,你不能只强迫FILE_FLAG_NO_BUFFERING
。它需要对齐的缓冲区,通常不提供这些缓冲区。此外,这是错误的。您不关心Windows是否提前读取32KB 。
您希望Windows执行的唯一操作是在阅读完文件后从缓存中丢弃文件内容。正确的标志是FILE_FLAG_SEQUENTIAL_SCAN
。这暗示了您(可能)不会回头的Windows,因此没有理由将这些字节保留在缓存中。
答案 1 :(得分:2)
您可以尝试将FILE_FLAG_NO_BUFFERING
传递给CreateFile()
以避免缓存。这对缓冲区提出了一些要求。具体来说,它们的大小必须是扇区大小的倍数,并且它们的地址必须与扇区大小对齐。有关详细信息,请参阅MSDN。
答案 2 :(得分:2)
假设您有权访问最终打开文件的CreateFile调用,则可以在打开文件时使用FILE_FLAG_NO_BUFFERING:
http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx
如果您不是直接自己调用CreateFile,而是通过某种类型的库,则需要查看它们是否提供了一种间接设置此标志的方法。
您可能还会发现,初始延迟是由加载大量可以组成Windows中的媒体堆栈的DLL引起的,在这种情况下,更改媒体文件本身的打开方式无济于事。
你可以通过在app启动时制作一个非常短的媒体文件来测试这个,以“预热”堆栈。