3

我正在实现一个媒体播放器并使用 NAudio 来播放我的文件。有什么方法可以在播放声音时提高播放速度(2X 或 4X)。代码示例将不胜感激。

在此先感谢干杯。

4

3 回答 3

5

NAudio 不包含用于更改音频播放速度的现成组件。但是,如果您创建自己的派生 WaveStream / IWaveProvider 并自己实现加速算法,这是可能的。将速度提高 2 倍或 4 倍的最简单方法就是丢弃样本。但是,质量不会很好(将引入人工制品),因此是否可以使用该选项取决于您的需求。

我曾经自己在 NAudio 中实现了可变播放速度,但不幸的是我不能在这里分享代码,因为它不是开源的。然而,Yuval Naveh 在其使用 NAudio 的PracticeSharp应用程序中实现了可变播放速度,因此您可能想看看他是如何做到的(我认为他是通过包装SoundTouch来实现的)。

于 2011-07-07T07:11:52.747 回答
2

我最近向 ispy 添加了变速播放 - 它使用 naudio 进行播放。PlaybackRate 是双重的 - 将其设置为减慢或加快音频:

if (WaveOutProvider != null)
{
    if (Math.Abs(PlaybackRate - 1) > double.Epsilon)
    {
    //resample audio if playback speed changed
    var newRate = Convert.ToInt32(_waveProvider.WaveFormat.SampleRate/PlaybackRate);
    var wf = new WaveFormat(newRate, 16, _waveProvider.WaveFormat.Channels);
    var resampleInputMemoryStream = new MemoryStream(data) {Position = 0};

    WaveStream ws = new RawSourceWaveStream(resampleInputMemoryStream, _waveProvider.WaveFormat);
    var wfcs = new WaveFormatConversionStream(wf,ws) {Position = 0};
    var b = new byte[ws.WaveFormat.AverageBytesPerSecond];

    int bo = wfcs.Read(b, 0, ws.WaveFormat.AverageBytesPerSecond);
    while (bo > 0)
    {
        WaveOutProvider.AddSamples(b, 0, bo);
        bo = wfcs.Read(b, 0, ws.WaveFormat.AverageBytesPerSecond);
    }
    wfcs.Dispose();
    ws.Dispose();

    }
    else
    {
    WaveOutProvider.AddSamples(data, 0, data.Length);    
    }

}
于 2013-06-11T03:15:03.797 回答
0

我已经完成了他们正在实现 Speed on Fly(音频播放时)的 PracticeSharp。但我的要求不匹配。如果有任何简单的 Speed on Fly 解决方案,请提供,例如 VolumeSampleProvider 这样的 VolumeSampleProvider 是否有任何用于 Speed 更改的类。

于 2011-08-05T11:24:35.263 回答