メディアプレーヤーを実装し、NAudioを使用してファイルを再生しています。サウンドの再生中に(2Xまたは4X)のように再生速度を上げる方法はありますか?コードサンプルをいただければ幸いです。
AdvanceCheersに感謝します。
メディアプレーヤーを実装し、NAudioを使用してファイルを再生しています。サウンドの再生中に(2Xまたは4X)のように再生速度を上げる方法はありますか?コードサンプルをいただければ幸いです。
AdvanceCheersに感謝します。
NAudio には、オーディオ再生の速度を変更する既成のコンポーネントは含まれていません。ただし、独自の派生 WaveStream / IWaveProvider を作成し、高速化アルゴリズムを自分で実装する場合は可能です。2 倍または 4 倍の速度を上げる最も簡単な方法は、サンプルを捨てることです。ただし、品質は良くありません(アーティファクトが導入されます)ので、そのオプションを使用できるかどうかはあなたのニーズに依存します.
私は一度、NAudio で可変再生速度を実装しましたが、残念ながらオープン ソースではないため、ここでコードを共有することはできません。ただし、Yuval Naveh は、NAudio を使用する彼のPracticeSharpアプリケーションの一部として可変再生速度を実装しているので、彼がどのようにそれを行ったかを確認したい場合があります (彼はSoundTouchをラップすることでそれを実現していると思います)。
私は最近、再生に 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);
}
}
Speed on Fly (オーディオ再生中) を実装している PracticeSharp を実行しました。しかし、私の要件は一致しませんでした。Speed on Fly で動作する簡単なソリューションがある場合は、提供してください。ボリュームの例として、このような VolumeSampleProvider には Speed 変更用のクラスがあります。