我正在实现一个媒体播放器并使用 NAudio 来播放我的文件。有什么方法可以在播放声音时提高播放速度(2X 或 4X)。代码示例将不胜感激。
在此先感谢干杯。
我正在实现一个媒体播放器并使用 NAudio 来播放我的文件。有什么方法可以在播放声音时提高播放速度(2X 或 4X)。代码示例将不胜感激。
在此先感谢干杯。
NAudio 不包含用于更改音频播放速度的现成组件。但是,如果您创建自己的派生 WaveStream / IWaveProvider 并自己实现加速算法,这是可能的。将速度提高 2 倍或 4 倍的最简单方法就是丢弃样本。但是,质量不会很好(将引入人工制品),因此是否可以使用该选项取决于您的需求。
我曾经自己在 NAudio 中实现了可变播放速度,但不幸的是我不能在这里分享代码,因为它不是开源的。然而,Yuval Naveh 在其使用 NAudio 的PracticeSharp应用程序中实现了可变播放速度,因此您可能想看看他是如何做到的(我认为他是通过包装SoundTouch来实现的)。
我最近向 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);
}
}
我已经完成了他们正在实现 Speed on Fly(音频播放时)的 PracticeSharp。但我的要求不匹配。如果有任何简单的 Speed on Fly 解决方案,请提供,例如 VolumeSampleProvider 这样的 VolumeSampleProvider 是否有任何用于 Speed 更改的类。