【问题标题】:Replay a BufferedWaveProvider重放 BufferedWaveProvider
【发布时间】:2018-10-17 20:16:19
【问题描述】:

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

【问题讨论】:

    标签: c# record naudio playback waveout


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复马克(以及您的图书馆顺便说一句!)那么您认为使用 wav 文件而不是内存是一个更好的主意吗?录制 > 保存到 wav 文件 > 播放这个 wav 文件 > 修剪它,用第二条记录创建一个新的波形文件,然后连接两个文件?等等等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2022-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多