3

メディアプレーヤーを実装し、NAudioを使用してファイルを再生しています。サウンドの再生中に(2Xまたは4X)のように再生速度を上げる方法はありますか?コードサンプルをいただければ幸いです。

AdvanceCheersに感謝します。

4

3 に答える 3

5

NAudio には、オーディオ再生の速度を変更する既成のコンポーネントは含まれていません。ただし、独自の派生 WaveStream / IWaveProvider を作成し、高速化アルゴリズムを自分で実装する場合は可能です。2 倍または 4 倍の速度を上げる最も簡単な方法は、サンプルを捨てることです。ただし、品質は良くありません(アーティファクトが導入されます)ので、そのオプションを使用できるかどうかはあなたのニーズに依存します.

私は一度、NAudio で可変再生速度を実装しましたが、残念ながらオープン ソースではないため、ここでコードを共有することはできません。ただし、Yuval Naveh は、NAudio を使用する彼のPracticeSharpアプリケーションの一部として可変再生速度を実装しているので、彼がどのようにそれを行ったかを確認したい場合があります (彼はSoundTouchをラップすることでそれを実現していると思います)。

于 2011-07-07T07:11:52.747 に答える
2

私は最近、再生に naudio を使用する ispy に可変速再生を追加しました。PlaybackRate は double です - オーディオを遅くしたり速くしたりするには設定してください:

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 には Speed 変更用のクラスがあります。

于 2011-08-05T11:24:35.263 に答える