Naudio:如何播放MP3和WAV文件?

5

好的,我知道对于一些人来说,这似乎是一个非常简单的问题,但我真的卡在这里了。实际上,我正在使用Naudio构建音频播放器,我意识到在许多教程中,人们总是展示简单的方法来让你开始。然而,在我看来,他们总是忘记展示如何在实际应用中完成任务。例如,在使用 Naudio 播放音乐时,我会做出以下操作:

  Void PlayAudioMusic(string FilePath)

  {

     using (var ms = File.OpenRead(FilePath))
    using (var rdr = new Mp3FileReader(ms))
    using (var wavStream = WaveFormatConversionStream.CreatePcmStream(rdr))
    using (var baStream = new BlockAlignReductionStream(wavStream))
    using (var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
    {
        waveOut.Init(baStream);
        waveOut.Play();

    }
 }

这对于在简单的控制台应用程序中进行测试非常有用。然而,如果你真的正在构建一个严肃的应用程序,这是没有用处的。例如,许多教程从来没有说过最关键的事情,比如:
  1. 处理资源的释放和何时释放
  2. 处理不同异常的最佳方法
  3. 在暂停、停止、倒带甚至退出应用程序之前要做什么
  4. 其他我甚至不知道存在的东西。由于我正在经历这个过程,并注意到我的应用程序抛出了太多的异常,有人能分享一下他用来处理这个问题的 Naudio 包装类吗?我相信这将回答我们中的许多人在尝试使用 Naudio 时遇到的问题。
谢谢。
1个回答

11
  1. 为了处理非托管资源,您需要调用WaveStreams的Close方法。 "何时执行"部分相当明显...您真的不知道何时是处理非托管资源的正确时间吗?当您不再使用它们时,请处理它们。
  2. 对不起,我无法回答这个问题。
  3. 要暂停,您需要调用WaveOut对象的Pause方法。要倒带,您需要调用WaveStream的Seek方法。要停止,请不要调用WaveOut的Stop方法。您必须先调用Pause,然后调用WaveStream的Seek方法以返回缓冲区开头。
  4. 所有异常被抛出的最可能原因是因为您展示的大部分代码实际上都是不必要的。播放MP3文件所需做的全部应该是:
WaveStream mainOutputStream = new Mp3FileReader(path_of_the_file_you_want_to_play);
WaveChannel32 volumeStream = new WaveChannel32(mainOutputStream);
    
WaveOutEvent player = new WaveOutEvent();
    
player.Init(volumeStream);
    
player.Play();

我个人更喜欢使用WaveOutEvent而不是WaveOut,因为它不需要使用Windows Forms或WPF,使您可以在使用C#制作的任何类型的应用程序中使用NAudio,甚至包括XNA游戏。此外,WaveOutEvent具有非常易于使用的特点,并且其构造函数甚至不需要回调。

所有这些用于更改缓冲区内容(例如采样率或比特深度)的WaveStreams仅是要求NAudio抛出异常的方式。当像这样使用时,它们很少起作用。如果您想转换一些缓冲区内容,则必须调用WaveFormatConversionStream的一些静态方法(它们的名称至少很自解)。


2
非常好的回答。为了准确起见,让我指出,它应该是 Mp3FileReader,小写字符 'p'。 - henon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接