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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top