2013-01-03 208 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