Naudio:如何播放 MP3 和 WAV 文件?
Posted
技术标签:
【中文标题】Naudio:如何播放 MP3 和 WAV 文件?【英文标题】:Naudio: How to play MP3 and WAV file? 【发布时间】:2011-12-28 08:17:54 【问题描述】:好的,我知道这听起来对某些人来说是一个非常简单的问题,但我真的被困在这里了。事实上,我正在使用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();
这非常适合在简单的控制台应用程序中进行测试。但是,如果您实际上正在构建一个严肃的应用程序,这将没有用。例如,许多教程从未说过如何处理最关键的事情,例如:
-
处置资源以及何时处置
处理不同异常的最佳方法
在暂停、停止、倒带甚至退出应用程序之前要做什么
其他我什至不知道的东西存在。
由于我正在经历这个过程并注意到我的应用程序抛出了太多异常,有人可以分享一下他用来处理这个问题的 Naaudio 的包装类。我相信这将解决我们中的一些人在尝试使用 Nadio 时遇到的许多问题。
谢谢。
【问题讨论】:
【参考方案1】:-
要释放非托管资源,请调用 WaveStreams 的 Close 方法。 “什么时候做”部分是相当明显的......你真的不知道什么时候是处置非托管资源的正确时间吗?当您不再使用它们时,您将它们丢弃。
我无法回答这个问题。抱歉。
要暂停,请调用 WaveOut 对象的 Pause 方法。要倒带,请调用 WaveStream 的 Seek 方法。要停止,不要调用 WaveOut 的 Stop 方法。您必须先调用 Pause,然后调用 WaveStream 的 Seek 方法才能到达缓冲区的开头。
引发所有异常的最可能原因是您显示的大部分代码实际上是不必要的。播放 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 的一些静态方法(至少它们的名称是不言自明的。)
【讨论】:
很好的答案。为了正确起见,让我指出,它应该是带有小写“p”的 Mp3FileReader。以上是关于Naudio:如何播放 MP3 和 WAV 文件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 NAudio 转换为 WAV 后使用 SoundPlayer 播放 MP3