Replay a BufferedWaveProvider



我使用 NAudio 从麦克风记录数据,然后我需要在不写入 wav 文件的情况下播放音频。

播放/暂停/停止工作得很好,但是如何将位置设置回bwp的开头并从音频开始播放。

我还不能写 wav 文件,因为我需要播放文件,使用滑块浏览它,然后用新记录的数据擦除缓冲区的末尾,然后保存修改后的文件。

private void btn_Start_Click(object sender, EventArgs e)
{
if (sourceList.SelectedItems.Count == 0) 
return;
int deviceNumber = sourceList.SelectedItems[0].Index;
wo = new WaveOutEvent();
wi = new WaveIn();
wi.DeviceNumber = deviceNumber;
wi.WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(deviceNumber).Channels);
wi.DataAvailable += new EventHandler<WaveInEventArgs>(wi_DataAvailable);
bwp = new BufferedWaveProvider(wi.WaveFormat);
bwp.BufferDuration = new TimeSpan(1, 0, 0);
bwp.DiscardOnBufferOverflow = false;
wi.StartRecording();
}
private void wi_DataAvailable(object sender, WaveInEventArgs e)
{
bwp.AddSamples(e.Buffer, 0, e.BytesRecorded);
}
private void btn_Stop_Click(object sender, EventArgs e)
{
wi.StopRecording();
wo.Init(bwp);
}
private void btn_InitWaveOut_Click(object sender, EventArgs e)
{
wo.Play();
}
private void btn_StopWaveOut_Click(object sender, EventArgs e)
{
wo.Stop();
}
private void btn_PauseWaveOut_Click(object sender, EventArgs e)
{
wo.Pause();
}

BufferedWaveProvider不是为支持重新定位而设计的。如果需要,您应该创建自己的IWaveProvider派生类,该类保留接收的所有字节以允许重新定位。显然,您需要注意使用多少内存,因为音频数据会随着时间的推移而变得相当大。

相关内容

  • 没有找到相关文章

最新更新