【问题标题】:Playing a MP3 file with a slower playback以较慢的播放速度播放 MP3 文件
【发布时间】:2013-01-03 22:49:46
【问题描述】:

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

我需要以较慢的速度播放 MP3 文件(以 0.75 倍或 0.5 倍的速度播放)。我最初的想法是改变 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);

如果我运行它,当 tempStream 的构造函数运行时,我会收到一个 MmException,上面写着“AcmNotPossible 调用 acmStreamOpen”。

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

【问题讨论】:

    标签: c# naudio


    【解决方案1】:

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

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

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

    【讨论】:

    • 这款 SoundTouch 似乎非常适合我的需要。我去看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2017-06-29
    • 1970-01-01
    • 2011-06-17
    • 2014-10-21
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多