Pregunta

Estoy tratando de leer muestras PCM de un archivo MP3 (convertido) usando NAudio, pero fallando, el método Read devuelve cero (indicando EOF) cada vez.

Ejemplo: este fragmento de código, que intenta leer una muestra única de 16 bits, siempre se 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));
                    }
                }
            }
        }
    }
}

salida:

16 bit PCM: 44kHz 2 channels
0

Pero esta versión que lee desde un archivo WAV funciona bien (usé iTunes para convertir el MP3 a un WAV, por lo que deberían contener muestras similares):

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));
        }
    }
}

salida:

16 bit PCM: 44kHz 2 channels
2

¿Qué está pasando aquí? Ambas secuencias tienen los mismos formatos de onda, por lo que esperaría poder usar la misma API para leer muestras. Establecer la propiedad Position tampoco ayuda.

¿Fue útil?

Solución

Probablemente necesites leer en trozos más grandes. NAudio usa ACM para realizar la conversión de MP3 a WAV, y si el búfer de destino no es lo suficientemente grande, el códec puede rehusarse a convertir cualquier dato. En otras palabras, debe convertir un bloque de muestras antes de poder leer la primera muestra.

Los archivos WAV son una cuestión diferente, ya que es agradable y fácil leer una sola muestra de ellos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top