Как воспроизвести файл MP3 с помощью NAudio

WaveStream waveStream = new Mp3FileReader(mp3FileToPlay);
var waveOut = new WaveOut();
waveOut.Init(waveStream); 
waveOut.Play();

Это создает исключение:

WaveBadFormat, вызывающий waveOutOpen

Тип кодировки "MpegLayer3", как NAudio.

Как я могу воспроизвести mp3 файл с помощью NAudio?

2 ответа

Решение

Попробуйте вот так:

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);
            }
        }
    }
}

Редактировать этот код сейчас устарело (относится к NAudio 1.3). Не рекомендуется на более новых версиях NAudio. Пожалуйста, посмотрите альтернативный ответ.

Для пользователей NAudio 1.6 и выше, пожалуйста, не используйте код в оригинальном принятом ответе. Вам не нужно добавлять WaveFormatConversionStreamили BlockAlignReductionStream, и вы должны избегать использования WaveOut с обратными вызовами функций (WaveOutEvent предпочтительнее, если вы не находитесь в приложении WinForms или WPF). Кроме того, если вы не хотите блокировать воспроизведение, вы обычно не спите, пока аудио не закончится. Просто подпишитесь на WaveOut"s PlaybackStopped событие.

Следующий код будет отлично работать для воспроизведения MP3 в NAudio:

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

Я предпочитаю воспроизводить любые файлы MP3 с помощью NAudio. Я предпочитаю блокировать поток воспроизведения, пока воспроизведение не остановится с помощью прослушивателей событий. Кроме того, для лучшей совместимости я использую MP3Sharp для загрузки файла MP3, а затем передаю его в NAudio, поскольку NAudio не поставлялся с кодеками MP3.

using System;
using NAudio.Wave;
using System.Threading;
using MP3Sharp;
using System.IO;

namespace jessielesbian.NAudioTest
{
    public static class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("loading and parsing MP3 file...");
            MP3Stream stream = new MP3Stream("c:\\workspaces\\Stunning!  Boeing's 737 MAX on Flying Display.mp3");
            WaveFormat waveFormat = new WaveFormat(stream.Frequency, stream.ChannelCount);
            Console.WriteLine("allocating playback cache...");
            FastWaveBuffer fastWaveBuffer = new FastWaveBuffer(waveFormat, (int) stream.Length);
            Console.WriteLine("populating playback cache...");
            stream.CopyTo(fastWaveBuffer);
            fastWaveBuffer.Seek(0, SeekOrigin.Begin);
            Console.WriteLine("unloading MP3 file...");
            stream.Dispose();
            Console.WriteLine("prepairing player...");
            WaveOutEvent waveOutEvent = new WaveOutEvent();
            waveOutEvent.Init(fastWaveBuffer);
            waveOutEvent.Volume = 1;
            Console.WriteLine("arming ManualResetEvent...");
            ManualResetEvent manualResetEvent = new ManualResetEvent(false);
            waveOutEvent.PlaybackStopped += (object sender, StoppedEventArgs e) => {
                manualResetEvent.Set();
            };
            Console.WriteLine("done!");
            waveOutEvent.Play();
            manualResetEvent.WaitOne();
        }
    }
    public sealed class FastWaveBuffer : MemoryStream, IWaveProvider
    {
        public FastWaveBuffer(WaveFormat waveFormat, byte[] bytes) : base(bytes)
        {
            WaveFormat = waveFormat;
        }
        public FastWaveBuffer(WaveFormat waveFormat, int size = 4096) : base()
        {
            WaveFormat = waveFormat;
            Capacity = size;
        }
        public WaveFormat WaveFormat
        {
            get;
        }
    }
}

Другие вопросы по тегам