我正在尝试使用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
属性也无济于事。
答案 0 :(得分:1)
您可能需要阅读更大的块。 NAudio使用ACM执行从MP3到WAV的转换,如果您的目标缓冲区不够大,编解码器可能会拒绝转换任何数据。换句话说,您需要先转换一个样本块,然后才能读取第一个样本。
WAV文件是另一回事,因为它很容易从中读取单个样本。