2010-05-08 15 views
2

NAudio Bibliothèque: http://naudio.codeplex.com/mal à convertir un fichier MP3 à un fichier WAV en utilisant NAudio

Je suis en train de convertir un fichier MP3 à un fichier WAV, mais je n'ai plus pour une petite erreur. Je sais ce qui ne va pas, mais je ne sais pas vraiment comment y remédier.

Voici le morceau de code que je suis en cours d'exécution:

private void button1_Click(object sender, EventArgs e) { 
    using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) { 
     using(WaveFileWriter writer = new WaveFileWriter(@"C:\test.wav", new WaveFormat())) { 
      int counter = 0; 
      while(reader.Read(test, counter, test.Length + counter) != 0) { 
       writer.WriteData(test, counter, test.Length + counter); 
       counter += 512; 
      } 
     } 
    } 
} 

reader.Read() va dans la classe Mp3FileReader, et la méthode ressemble à ceci:

public override int Read(byte[] sampleBuffer, int offset, int numBytes) 
{ 
    if (numBytes % waveFormat.BlockAlign != 0) 
     //throw new ApplicationException("Must read complete blocks"); 
     numBytes -= (numBytes % waveFormat.BlockAlign); 
    return mp3Stream.Read(sampleBuffer, offset, numBytes); 
} 

mp3Stream est un objet de la classe Stream.

Le problème est: j'obtiens une ArgumentException. MSDN dit que c'est parce que la somme de offset et numBytes est supérieure à la longueur de sampleBuffer.

Documentation: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

Cela arrive parce que j'augmente le compteur à chaque fois, mais la taille du tableau d'octets test reste le même. Ce que je me demandais est: ai-je besoin d'augmenter dynamiquement la taille du tableau, ou ai-je besoin de trouver la taille nécessaire au début et de la définir tout de suite?

Et aussi, au lieu de 512, la méthode dans Mp3FileReader renvoie 365 la première fois. Quelle est la taille d'un bloc entier. Mais je suis en train d'écrire le 512 complet. Je suis simplement en train d'utiliser la lecture pour vérifier si je ne suis pas encore à la fin du fichier. Est-ce que je dois attraper la valeur de retour et faire quelque chose avec cela, ou suis-je bon ici?

Répondre

4

Vous devez utiliser la valeur de retour de Read() pour déterminer le nombre d'octets réellement obtenus. Il ne doit pas être 512, vous l'avez déjà trouvé. Et gardez à l'esprit que vous travaillez avec des flux, pas des tableaux. Faites en sorte qu'il ressemble à ceci:

using (var reader = new Mp3FileReader(@"path\to\MP3")) { 
     using (var writer = new WaveFileWriter(@"C:\test.wav", new WaveFormat())) { 
      var buf = new byte[4096]; 
      for (;;) { 
       var cnt = reader.Read(buf, 0, buf.Length); 
       if (cnt == 0) break; 
       writer.WriteData(buf, 0, cnt); 
      } 
     } 
    } 
+0

D'accord, je le fais maintenant, et le résultat est beaucoup de bruit statique. Pourtant, c'est un problème complètement différent. – KdgDev

+0

essayer de changer octet [] buf = nouvel octet [4096]; au lieu de byte buf = new byte [4096]; – fyasar

+0

Cela ne fonctionne pas pour Windows 8.1 Store app que j'essaie. Pouvez-vous poster la méthode mise à jour ou me guider vers un lien approprié? – Wajahat

1

Vous n'effectuez aucune conversion de MP3 en WAV dans votre exemple. Vous avez besoin de WaveFormatConversionStream. Essayez quelque chose comme ceci:

private void button1_Click(object sender, EventArgs e) { 
    using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) { 
     using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) { 
      WaveFileWriter.CreateWaveFile(outputFileName, convertedStream); 
     } 
    } 
} 
+0

Ça a l'air bien, mais ça ne marchera pas. Je continue d'obtenir une exception "AcmNotPossible appel acmStreamOpen". – KdgDev

+0

c'est probablement parce que votre format cible ne correspond pas au format converti naturel du MP3. Je vais mettre à jour l'exemple de code –