10
votes

Comment lire un fichier MP3 en utilisant Naudio

WaveStream waveStream = new Mp3FileReader(mp3FileToPlay);
var waveOut = new WaveOut();
waveOut.Init(waveStream); 
waveOut.Play();
This throws an exception:
  WaveBadFormat calling waveOutOpen
The encoding type is "MpegLayer3" as NAudio.How can I play a mp3 file with NAudio?

0 commentaires

3 Réponses :


9
votes

Essayez comme ceci:

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


6 commentaires

Cela ne fonctionne pas. "InvalidParamètre appelant acmstreamprepareheader"


Je viens de télécharger la dernière version de Naudio ( codépleplex.com/naudio ) et testé ce code avec un mp3 sur mon ordinateur. Cela a fonctionné pour moi.


Avez-vous un environnement 64 bits? J'ai recompanté la solution à l'aide de x64, mode de sortie et a changé la plate-forme .NET de .NET 2.0 à 3.5 ... peut-être à cause de cela, je reçois les erreurs?


Oui, je suis en cours sur Win7 64bit, j'ai dû cibler x86 dans les propriétés du projet pour que cela fonctionne. Ciblage n'importe quel CPU a jeté un badimageformatException pour naudio.dll .


Merci! Maintenant, ça marche :) J'ai lu partout que l'on recompilait Naudio à X64 ...


Le support X64 à Naudio, j'espère aller très vite très bientôt. Voir les récents Checkins - NAUDIO.CODEPLEX.COM/SOURCECONTROL/LIST/CHANGESTS



46
votes

Pour les utilisateurs de Naudio 1.6 et plus, veuillez ne pas utiliser le code dans la réponse acceptée d'origine. Vous n'avez pas besoin d'ajouter un waveformatConversionstream code> ou un blockalignréductionStream code>, et vous devez éviter d'utiliser Waveout code> avec des rappels de fonction ( WaveOutEvent est préférable si vous n'êtes pas dans une application WinForms ou WPF). De plus, sauf si vous souhaitez bloquer la lecture, vous ne dormiriez pas normalement avant la finition audio. Il suffit de vous abonner à waveout code> 's lecture de lecture code> événement.

Le code suivant fonctionnera très bien pour jouer un MP3 à Naudio: P>

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


7 commentaires

Hey Mark, merci de votre réponse. J'aimerais savoir, selon votre réponse, où le fichier "Test.mp3" doit-il être situé à?


Wow. Une telle réponse votée élevée avec le code exact comme écrit par OP - ou où est exactement la différence? Je ne peux pas repérer un.


Waveout est jetable mais jamais disposé dans votre code. Si vous le disposez, l'audio cesse de jouer. Si vous ne le disposez pas, il ne jouera probablement que jusqu'à ce que le collecteur des ordures le recueille.


En outre, le fichier reste utilisé si le lecteur n'est pas fermé. Cela rend impossible par ex. Déplacez ou renommez le fichier dans Explorer, même si la lecture est déjà arrêtée.


@Thomasweller c'est parce que je suppose que vous jouez dans une application WinForms ou WPF. Le code permettant de disposer que le périphérique MP3filerReader et Wowout doit se produire lorsque vous avez fini de jouer ou fermez le formulaire. Voir Ce tutoriel pour plus de détails


@Thomasweller Vous avez raison la question et la réponse ont le même code. La différence est la date. Lorsque la question initiale posée, MP3filerAder n'a pas édité PCM de sa méthode de lecture afin que le code ne fonctionnait pas. La réponse acceptée originale n'est maintenant pas une façon recommandée de résoudre le problème.


@Markheath - Je suis récemment tombé sur Naudio après avoir enfin décidé que la corruption constante de Mes playllist de WMP garantissait un projet de lecteur MP3 personnel. En moins d'une journée, avec votre bibliothèque, j'ai pu créer facilement un clone WMP qui respecte les listes de lecture. J'ai trouvé votre appel ici pour votre réponse plutôt ironique, en considérant que vous êtes, en fait, l'auteur de Naudio. Votre bibliothèque est si bien intégrée à .NET 4.7+ sur Windows 10 que cela n'a que quelques heures seulement pour mettre en œuvre complètement. 6 ans à partir de votre réponse initiale, le code est toujours écrit. Merci.



0
votes

Mon moyen préféré de lire tous les fichiers MP3 avec Naudio, c'est ceci. Je préfère bloquer le fil de lecture jusqu'à ce que la lecture soit arrêtée avec les auditeurs d'événements. En outre, pour la meilleure compatibilité, j'utilise mp3Sharp pour charger le fichier MP3, puis le transmettre à Naudio depuis Naudio, Naudio n'est pas livré avec des codecs 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;
        }
    }
}


0 commentaires