【发布时间】:2011-07-07 05:15:21
【问题描述】:
我正在实现一个媒体播放器并使用 NAudio 来播放我的文件。有什么方法可以在播放声音时提高播放速度,例如(2X 或 4X)。代码示例将不胜感激。
提前致谢 干杯。
【问题讨论】:
标签: c# media-player naudio
我正在实现一个媒体播放器并使用 NAudio 来播放我的文件。有什么方法可以在播放声音时提高播放速度,例如(2X 或 4X)。代码示例将不胜感激。
提前致谢 干杯。
【问题讨论】:
标签: c# media-player naudio
NAudio 不包含用于更改音频播放速度的现成组件。但是,如果您创建自己的派生 WaveStream / IWaveProvider 并自己实现加速算法,这是可能的。获得 2 倍或 4 倍速度提升的最简单方法就是丢弃样本。但是,质量不会很好(将引入人工制品),因此是否可以使用该选项取决于您的需求。
我曾经自己在 NAudio 中实现了可变播放速度,但不幸的是我不能在这里分享代码,因为它不是开源的。然而,Yuval Naveh 在他的 PracticeSharp 应用程序中实现了可变播放速度,该应用程序使用 NAudio,因此您可能想看看他是如何做到的(我认为他通过包装 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 更改的类。
【讨论】: