【问题标题】:How do I read a file in parts with NAudio?如何使用 NAudio 读取部分文件?
【发布时间】:2014-01-24 04:43:59
【问题描述】:

我对 C# 和 Mark 的库 NAudio 还很陌生。所以我试着自己学习,我想出了一个基本的音频播放器。但我有一个问题。

当尝试在播放器中加载大文件时,应用会在加载整个文件时冻结 2-10 秒(我想)。这是我读取文件的代码:

if (target.EndsWith("mp3") || target.EndsWith("Mp3") || target.EndsWith("MP3"))
        {
            NAudio.Wave.WaveStream pcm = NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(new NAudio.Wave.Mp3FileReader(target));
            stream = new NAudio.Wave.BlockAlignReductionStream(pcm);
        }

我真正想要的只是部分读取文件。像一个缓冲区。从 HDD 读取 10 秒到 RAM 内存,然后在这 10 秒用完后,读取接下来的 10 秒,依此类推。我认为这应该可以解决我在处理大文件时遇到的冻结问题。

【问题讨论】:

  • 这不是您问题的答案,但您可以使用 if (target.Upper().EndsWith("MP3")) 测试 mp3。
  • 请注意,您不需要 WaveFormatConversionStream 或 BlockAlignReductionStream。您在哪里看到包含这些的代码示例?
  • 嗨!比你为你的答案。 @MarkHeath - 我关注了 Giawa 的这个系列教程 - Youtube Video。代码来自这个视频,我使用的实际代码显示在@2:15。
  • 好的,该演示与 NAudio 1.3 相关。自那以后发生了很多变化
  • 哦,我可能忽略了这一点。我会搜索一些较新的教程,或者我会尝试根据 codeplex 网站提供的示例编写一个新脚本。

标签: c# buffer naudio


【解决方案1】:

延迟的原因是Mp3FileReader 创建了一个目录以允许它确定文件长度并实现更快的重新定位。您可以尝试改用MediaFoundationReader,这样会更快,但不适用于 Windows XP。

【讨论】:

  • MediaFoundationRader 就像它应该的那样工作,文件加载速度更快(几乎是瞬间)。感谢您的快速答复! :)
【解决方案2】:

所有程序在加载大文件时都有延迟。这取决于客户端计算机的速度。 但是您可以在程序中使用 backgroundWorker 并在文件加载期间在应用程序窗体上显示加载动画。

在表单上添加 backgroundWorker 工具

在打开按钮点击时使用此代码:

backgroundWorker_name.RunWorkerAsync();

并将您的代码放入 DoWork 事件

private void backgroundWorker_name_DoWork(object sender, DoWorkEventArgs e)
{
}

【讨论】:

  • 谢谢!我一定会试试这个。但我想了解音频播放器,如 foobar2000、VLC 或 WinAmp 是如何立即加载文件而无需大量 CPU 和 HDD 工作的。我将测试我的播放器以及您在固态驱动器上提供的代码,看看它如何影响加载时间。
猜你喜欢
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多