使用NAudio直接从转换的MP3文件中读取样本

时间:2009-11-26 15:55:45

标签: c# mp3 naudio

我正在尝试使用NAudio从(转换的)MP3文件中读取PCM样本,但由于Read方法每次都返回零(表示EOF)而失败。

示例:这段代码尝试读取单个16位样本,始终打印“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));
                    }
                }
            }
        }
    }
}

输出:

16 bit PCM: 44kHz 2 channels
0

但是从WAV文件中读取的这个版本工作正常(我使用iTunes将MP3转换为WAV,因此它们应该包含类似的样本):

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

输出:

16 bit PCM: 44kHz 2 channels
2

这里发生了什么?两个流都具有相同的波形格式,因此我希望能够使用相同的API来读取样本。设置Position属性也无济于事。

1 个答案:

答案 0 :(得分:1)

您可能需要阅读更大的块。 NAudio使用ACM执行从MP3到WAV的转换,如果您的目标缓冲区不够大,编解码器可能会拒绝转换任何数据。换句话说,您需要先转换一个样本块,然后才能读取第一个样本。

WAV文件是另一回事,因为它很容易从中读取单个样本。