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

标签 c# audio mp3 wav naudio

好吧,我知道这对某些人来说听起来像是一个非常简单的问题,但我真的被困在这里了。事实上,我正在使用 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. 要处置非托管资源,您可以调用 WaveStreams 的 Close 方法。 “何时执行”部分相当明显......你真的不知道什么时候是处置非托管资源的正确时间吗?当您不再使用它们时,您可以丢弃它们。
  2. 我无法回答这个问题。对不起。
  3. 要暂停,您可以调用 WaveOut 对象的暂停方法。要倒带,您可以调用 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 窗体或 WPF,使您能够将 NAudio 用于任何您想使用 C# 制作的应用程序,甚至是 XNA 游戏。此外,WaveOutEvent 具有非常好的即发即弃可用性,它的构造函数甚至不要求回调。

所有这些 WaveStreams 旨在改变缓冲区的内容(例如比特深度的采样率)只是要求 NAudio 抛出异常的方式。像这样使用时它们很少起作用。如果你想转换缓冲区的一些东西,你必须调用 WaveFormatConversionStream 的一些静态方法(至少它们的名称是不言自明的。)

关于c# - Naudio: 如何播放 MP3 和 WAV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8653452/

相关文章:

c# - 调试多线程 c# 代码 : Is it possible to break into one thread and keep the others running?

c# - 如何从非托管 DLL 访问 csharp 中包含动态数组的结构?

android - Hybrid Cordova应用程序:Android上本地没有声音

c# - 录制某个应用程序的声音

javascript - HTML 5音频自定义控件

windows - 从命令行创建无声 mp3

python - 如何在Python中获取mp3格式的youtube视频的直接链接?

javascript - 通过 ASP.net 中的 javascript 将字符串值从一个 Web 表单传递到另一个 Web 表单

c# - 检查字符串中的特殊字符 (/*-+_@&$#%)?

java - MediaController 方法 adjustmentVolume 和 MediaSession