1

我使用 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();
}
4

1 回答 1

0

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

于 2018-05-08T13:58:27.710 回答