Leitura amostras diretamente de um arquivo MP3 convertido usando NAudio
Pergunta
Eu estou tentando ler amostras PCM de um (convertida) arquivo MP3 utilizando NAudio, mas não como o método Read
retorna zero (indicando EOF) de cada vez.
Exemplo: esta parte do código, que as tentativas de ler uma amostra de 16 bits única, sempre 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));
}
}
}
}
}
}
saída:
16 bit PCM: 44kHz 2 channels
0
Mas esta versão que se lê de um arquivo WAV funciona bem (eu usei iTunes para converter o MP3 em um arquivo WAV para que eles devem conter amostras semelhantes):
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));
}
}
}
saída:
16 bit PCM: 44kHz 2 channels
2
O que está acontecendo aqui? Ambas as correntes têm os mesmos formatos de onda para se espera de ser capaz de usar a mesma API para ler amostras. Definir a propriedade Position
não ajuda.
Solução
Você provavelmente precisa ler em pedaços maiores. usos NAudio ACM para executar a conversão de MP3 para WAV, e se o seu buffer de destino não é grande o suficiente, o codec pode recusar-se a converter os dados em tudo. Em outras palavras, você precisa converter um bloco de amostras antes que você possa ler a primeira amostra.
arquivos WAV são uma questão diferente, pois é agradável e fácil de ler uma única amostra a partir deles.