如何使用NAudio播放MP3文件

Roo*_*ian 9 c# mp3 naudio

WaveStream waveStream = new Mp3FileReader(mp3FileToPlay);
var waveOut = new WaveOut();
waveOut.Init(waveStream); 
waveOut.Play();
Run Code Online (Sandbox Code Playgroud)

这引发了一个异常:

WaveBadFormat调用waveOutOpen

编码类型是"MpegLayer3"作为NAudio.

我怎么能用NAudio播放mp3文件?

Mar*_*ath 35

对于NAudio 1.6及以上版本的用户,请不要使用原始接受答案中的代码.您不需要添加a WaveFormatConversionStream或a BlockAlignReductionStream,并且应该避免使用WaveOut函数回调(WaveOutEvent如果您不在WinForms或WPF应用程序中,则更可取).此外,除非您想要阻止播放,否则在音频结束之前通常不会休眠.刚刚订阅WaveOutPlaybackStopped事件.

以下代码可以很好地在NAudio中播放MP3:

var reader = new Mp3FileReader("test.mp3");
var waveOut = new WaveOut(); // or WaveOutEvent()
waveOut.Init(reader); 
waveOut.Play();
Run Code Online (Sandbox Code Playgroud)

  • @MarkHeath - 我最近在最终决定 wmp 对我的播放列表的不断损坏需要一个个人 mp3 播放器项目后偶然发现了 NAudio。在不到一天的时间里,使用您的库,我能够轻松创建一个尊重播放列表的 wmp 克隆。考虑到您实际上是 NAudio 的作者,我发现您在此处对您的回答的呼唤颇具讽刺意味。您的库已很好地集成到 Windows 10 上的 .NET 4.7+ 中,只需几个小时即可完全实现。从您最初的回复算起 6 年后,代码仍然按编写的方式执行。谢谢你。 (4认同)
  • @ThomasWeller,你是对的,问题和答案具有相同的代码。区别在于日期。当提出最初的问题时,Mp3FileReader 没有从其 Read 方法中发出 PCM,因此代码不起作用。最初接受的答案现在不是解决问题的推荐方法。 (3认同)

Dar*_*rov 8

试试这样:

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑此代码现已过时(与NAudio 1.3相关).不推荐用于较新版本的NAudio.请参阅替代答案.