C# 以较慢的播放速度播放MP3文件

C# 以较慢的播放速度播放MP3文件,c#,naudio,C#,Naudio,我正在制作一个XNA 4.0游戏,我使用NAudio来播放声音,因为它比XNA的声音模块更强大 我需要以较慢的速度播放MP3文件(速度为0.75倍或0.5倍)。我最初的想法是改变波流的采样率。以下是我想做的: WaveStream originalWaveStream = new MP3FileReader(filepath); WaveChannel32 volumeStream = new WaveChannel32(originalWaveStream); //So I can chang

我正在制作一个XNA 4.0游戏,我使用NAudio来播放声音,因为它比XNA的声音模块更强大

我需要以较慢的速度播放MP3文件(速度为0.75倍或0.5倍)。我最初的想法是改变波流的采样率。以下是我想做的:

WaveStream originalWaveStream = new MP3FileReader(filepath);
WaveChannel32 volumeStream = new WaveChannel32(originalWaveStream); //So I can change the volume of the playback
WaveFormat tempFormat = new WaveFormat((int)(volumeStream.WaveFormat.SampleRate *     0.75f),(int)volumeStream.WaveFormat.BitsPerSample,(int)volumeStream.WaveFormat.Channels);
WaveFormatConversionStream tempStream = new WaveFormatConversionStream(tempFormat, volumeStream);
WaveChannel32 slowerWaveStream = new WaveChannel32(tempStream);
如果我运行这个,我会得到一个MmException,当tempStream的构造函数运行时,它会显示“acmnotmable调用acmStreamOpen”


我做错了什么?更改采样率是更改播放速度的唯一方法吗?有正确的方法吗?

您需要实现一种播放速度算法,NAudio没有提供这种算法

您的代码不工作的原因是因为volumeStream是IEEE浮点波形格式,并且您要求ACM重采样器使用浮点输入输出32位PCM,这是它无法做到的。如果您将WaveFormat.CreateIEEEFloatFormat用于tempFormat,那么这可能会“起作用”。然而,除了改变播放速度,你也会改变音高,所以这不是一个理想的解决方案。您可以通过另一个基音偏移进行补偿,但这种方法还有其他问题(例如在重采样过程中丢失或混叠部分频谱)


Yuval Naveh的开源使用NAudio并实现变速播放。他通过,这是一个开源库,可以执行时间(“节奏”)拉伸。这应该会给出很好的结果,而且比尝试编写自己的算法要容易得多。

这首歌似乎很适合我的需要。我来看看。