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.
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
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 –