Воспроизвести BufferedWaveProvider - PullRequest
0 голосов
/ 08 мая 2018

Я использую 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();
}

1 Ответ

0 голосов
/ 08 мая 2018

BufferedWaveProvider не предназначен для поддержки изменения положения. Если вы хотите, вы должны создать свой собственный IWaveProvider производный класс, который содержит все полученные байты, чтобы разрешить изменение положения. Очевидно, вы хотите быть осторожными с тем, сколько памяти вы используете, поскольку аудио данные могут со временем стать достаточно большими.

...