2013-01-03 203 views
1

我正在制作XNA 4.0游戏,我使用NAudio播放声音,因为它比XNA的声音模块更强大。播放较慢播放的MP3文件

我需要播放较慢的MP3文件(速度为0.75x或0.5x)。我最初的想法是改变WaveStream的采样率。这里是我想要做的事:

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); 

如果我跑,我得到,说:“AcmNotPossible调用acmStreamOpen”的tempStream的构造函数运行时的MmException。

我做错了什么?改变采样率是改变播放速度的唯一方法吗?有没有一个正确的方法来做到这一点?

回答

0

您需要实现NAudio不提供的播放速度算法。

你的代码不起作用的原因是因为volumeStream是一个IEEE浮点波形格式,并且你要求ACM重新采样器输出32位PCM输入不能进行的浮点输入。如果您使用WaveFormat.CreateIEEEFloatFormat for tempFormat,那么这可能会“工作”。但是,除了改变播放速度之外,您还需要调整音调,因此这不是一个理想的解决方案。您可以通过另一个音高转换来补偿,但这种方法还存在其他问题(例如在重采样期间丢失或混叠了部分频谱)。

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

+0

这个SoundTouch似乎很适合我需要的东西。我会看看它。 – UBSophung