播放播放速度较慢的MP3文件

时间:2013-01-03 22:49:46

标签: c# naudio

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

我需要慢速播放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);

如果我运行它,我会得到一个MmException,当tempStream的构造函数运行时,它会显示“AcmNotPossible调用acmStreamOpen”。

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

1 个答案:

答案 0 :(得分:2)

你需要实现一个播放速度算法,NAudio不提供。

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

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