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