0

我正在尝试使用 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属性也无济于事。

4

1 回答 1

1

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

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

于 2009-11-27T06:46:44.093 回答