2011-07-07 119 views

答えて

4

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

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

+0

おかげで –

0

私はPracticeSharpを経て、Fly on Fly(オーディオ再生中)を実装しています。私の要件は一致しませんでした。 Speed on Flyで作業する簡単な解決策があれば、VolumeSampleProviderにボリュームのサンプルを提供してください。これにはSpeedの変更に関するクラスがあります。

2

私は最近、再生用にnaudioを使用するispyに可変速再生を追加しました。 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);  
    } 

} 
+0

ショーンを試してみると私の結果を掲載します、私はあなたを試してみました(のSampleRateを変更するコンバータストリームを通過する)が、元の再生速度を維持しながらオーディオ品質を低下させます。 –