如何使用NAudio C改变播放速度#

时间:2011-07-07 05:15:21

标签: c# media-player naudio

我正在实施媒体播放器并使用NAudio播放我的文件。有没有办法在播放声音时增加播放速度,如(2X或4X)。代码示例将不胜感激。

先谢谢 欢呼声。

3 个答案:

答案 0 :(得分:5)

NAudio不包含用于改变音频播放速度的现成组件。但是,如果您创建自己的派生WaveStream / IWaveProvider并自己实现加速算法,则可以。获得2倍速或4倍速的最简单方法就是扔掉样品。但是,质量不会很好(将引入人工制品),所以这取决于您是否可以选择该选项。

我已经在NAudio中实现了变量播放速度,但不幸的是我不能在这里共享代码,因为它不是开源的。然而,Yuval Naveh已经实现了变量播放速度作为他使用NAudio的PracticeSharp应用程序的一部分,所以你可能想看看他是如何做到的(我认为他通过包裹SoundTouch来实现它)

答案 1 :(得分: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);    
    }

}

答案 2 :(得分:0)

我已经通过PracticeSharp他们正在实施Speed on Fly(同时播放音频)。但我的要求不符合。 如果有任何关于Speed on Fly工作的简单解决方案请提供,例如对于音量,VolumeSampleProvider就像这样有速度变化的类。