使用NAudio从MP3文件获取音频数据

时间:2013-11-25 18:48:29

标签: c# audio naudio

我希望能够从带有NAudio的MP3文件中获取音频数据,将左右声道中的数据平均化以创建一个数据集,然后将平均44.1KHz音频数据重新采样为8Khz,但我无法理解如何在NAudio Wavestream中表示数据。

如果我有1秒的MP3音频,那么我在WaveStream中会有多少字节?通过查看几个代码示例,似乎一个样本是4个字节,音频以44100Hz采样,我们有2个不同的通道,所以这意味着我们在波流中会有(44100 * 4 * 2)个字节,是吗?

我应该使用以下3个流中的哪一个 - AStream,PCM和inputStream来获取音频数据?以及如何分别访问左右声道数据?

var AStream = new MP3FileReader(myFilePath);
var PCM = new WaveConversionStream.Createpcm(AStream);
var inputStream = new WaveChannel32(new BlockAlignStream(PCM));

我一直在考虑使用WaveStream转换WaveFormatConversionStream,但下面的代码会抛出一个NAudio.MmException,上面写着“AcmNotPossible调用Acmstreamopen”的消息。

 var targetFormat = new WaveFormat(8000,1);
 var resampled = new WaveFormatConversionStream(targetFormat, inputStream);

如果targetFormat等于inputStream的格式,上面的代码甚至不起作用,所以我不知道我在这里做错了什么。

//Still throws NAudio.MmException
var resampled = new WaveFormatConversionStream(inputStream.WaveFormat, inputStream);

其他信息:VS2012,WPF,NAudio 1.6。

1 个答案:

答案 0 :(得分:0)

您似乎已复制了属于早期版本的NAudio的代码示例。 Mp3FileReader类将发出16位样本,并默认使用ACM MP3帧解压缩器。如果您希望直接以浮点形式使用样本,则可以使用AudioFileReader

将44.1kHz直接重采样到8kHz并不是一个特别好的主意,因为你最终会产生很多混叠,所以理想情况下首先应用低通滤波器。左右通道交错存储,因此您可以获得左侧样本,然后是右侧样本,依此类推。