2010-03-21 47 views
7
WaveStream waveStream = new Mp3FileReader(mp3FileToPlay); 
var waveOut = new WaveOut(); 
waveOut.Init(waveStream); 
waveOut.Play(); 

这将引发异常播放MP3文件。如何使用n音讯

如何使用NAudio播放mp3文件?

回答

7

尝试这样的:

class Program 
{ 
    static void Main() 
    { 
     using (var ms = File.OpenRead("test.mp3")) 
     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(); 
      while (waveOut.PlaybackState == PlaybackState.Playing) 
      { 
       Thread.Sleep(100); 
      } 
     } 
    } 
} 

编辑这个代码现在过时(涉及n音讯1.3)。不建议在较新版本的NAudio上使用。请参阅备选答案。

+1

这是行不通的。 “InvalidParameter calling acmStreamPrepareHeader” – Rookian 2010-03-21 19:51:00

+0

我刚刚下载了最新版本的NAudio(http://www.codeplex.com/naudio),并在我的电脑上用mp3测试了这段代码。它为我工作。 – 2010-03-21 19:53:38

+0

你有一个64位的环境?我已经使用x64重新编译了解决方案,释放模式并将.net平台从.NET 2.0更改为3.5 ...也许是因为这样我得到的错误? – Rookian 2010-03-21 19:56:35

28

对于NAudio 1.6及以上版本的用户,请不要使用原始接受答案中的代码。您不需要添加WaveFormatConversionStreamBlockAlignReductionStream,并且您应该避免使用带函数回调的WaveOut(如果您不在WinForms或WPF应用程序中,则最好使用WaveOutEvent)。另外,除非您想阻止播放,否则在音频结束之前通常不会睡眠。只需订阅WaveOutPlaybackStopped活动。

下面的代码将工作得很好,在n音讯发挥MP3:

reader = new Mp3FileReader("test.mp3"); 
var waveOut = new WaveOut(); // or WaveOutEvent() 
waveOut.Init(reader); 
waveOut.Play(); 
+0

嘿马克,谢谢你的回答。根据你的回答,我想知道“test.mp3”文件应该放在哪里? – Eido95 2016-05-07 13:35:42

+1

哇。如此高的投票答案与OP所写的确切代码 - 或者究竟有什么区别?我找不到一个。 – 2017-11-02 14:20:20

+0

WaveOut是一次性的,但从未放置在您的代码中。如果处置它,音频停止播放。如果你不处理它,它可能只会在垃圾收集器收集它之前发挥作用。 – 2017-11-02 14:45:47