C#音频获取音频文件持续时间/性能



我正在使用NAudio创建一个支持播放列表的音乐播放器。我检索每个轨道的持续时间如下:

return new AudioFileReader(FilePath).TotalTime;

但在处理许多曲目时,这是一个真正的性能杀手。对于15/20个音频文件,大约需要1秒。有没有优化的方法?我不认为我可以重用AudioFile阅读器对象,因为它没有提供任何方法,我也不知道还能用什么来获取音频文件的持续时间。

您可能已经解决了这个问题,但对于所有感兴趣的人来说,并行化将是一个选项。通常,与CPU繁忙相比,I/O进程非常缓慢。这应该利用这一点。

将重复调用每条轨道的长度计算的代码更改为这样的代码:

        var playTime = new TimeSpan();
        Parallel.ForEach( [yourFileList], file => {
            [...]
            var time = new AudioFileReader(file).TotalTime;
            playTime.Add(time);
            [...]
        });
        bar();

优势:

  • 简单:不需要在异步方法中,通常不需要太多更改

  • 将自动生成内部函数的多个任务,但等待所有任务完成,直到执行bar()为止(阻塞线程)。

缺点:

  • 正确的异常处理更"困难"

  • 不能取消

这在很大程度上取决于文件类型。为了获得最快的结果,假设您不需要支持WindowsXP,请尝试使用MediaFoundationReader

最新更新