2009-11-26 3 views
0

J'essaie de lire des échantillons PCM à partir d'un fichier MP3 (converti) en utilisant NAudio, mais échoue car la méthode Read renvoie zéro (indiquant EOF) à chaque fois.Lecture d'échantillons directement à partir d'un fichier MP3 converti en utilisant NAudio

Exemple: ce morceau de code qui tente de lire un seul échantillon de 16 bits, toujours imprime "0":

using System; 
using NAudio.Wave; 

namespace NAudioMp3Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (Mp3FileReader fr = new Mp3FileReader("MySong.mp3")) 
      { 
       byte[] buffer = new byte[2]; 
       using (WaveStream pcm = WaveFormatConversionStream.CreatePcmStream(fr)) 
       { 
        using (WaveStream aligned = new BlockAlignReductionStream(pcm)) 
        { 
         Console.WriteLine(aligned.WaveFormat); 
         Console.WriteLine(aligned.Read(buffer, 0, 2)); 
        } 
       } 
      } 
     } 
    } 
} 

sortie:

16 bit PCM: 44kHz 2 channels 
0 

Mais cette version qui se lit de un fichier WAV fonctionne bien (j'ai utilisé iTunes pour convertir le MP3 en WAV afin qu'ils contiennent des échantillons similaires):

static void Main(string[] args) 
{ 
    using (WaveFileReader pcm = new WaveFileReader("MySong.wav")) 
    { 
     byte[] buffer = new byte[2]; 
     using (WaveStream aligned = new BlockAlignReductionStream(pcm)) 
     { 
      Console.WriteLine(aligned.WaveFormat); 
      Console.WriteLine(aligned.Read(buffer, 0, 2)); 
     } 
    } 
} 

sortie:

16 bit PCM: 44kHz 2 channels 
2 

Que se passe-t-il ici? Les deux flux ont les mêmes formats d'onde donc je m'attendrais à pouvoir utiliser la même API pour lire des échantillons. La définition de la propriété Position n'aide pas non plus.

Répondre

1

Vous avez probablement besoin de lire en plus gros morceaux. NAudio utilise ACM pour effectuer la conversion de MP3 en WAV, et si votre tampon cible n'est pas assez grand, le codec peut refuser de convertir n'importe quelle donnée. En d'autres termes, vous devez convertir un bloc d'échantillons avant de pouvoir lire le premier échantillon.

Les fichiers WAV sont différents car il est agréable et facile de lire un seul échantillon.

+0

Je supposais que 'BlockAlignReductionStream' le ferait. Peut-être que je dois lui passer un paramètre pour lui dire d'allouer un plus grand tampon? – finnw

+0

oui, le flux de réduction d'alignement de bloc vous aide dans certains cas, mais probablement le sourceReadCount qu'il calcule dans la méthode Read est 0 ou trop faible. Serait intéressant si vous pouvez déboguer pour voir ce qu'il calcule sourceReadCount comme. Peut-être que je peux mettre une solution –

Questions connexes