Вы получаете 5-секундный аудиоклип не только потому, что вы делаете одноразовое BufferLength
чтение из BufferedWaveProvider
...
int count = bwp.BufferLength;
var read = bwp.Read(buffer, offset, count);
... и 5 секунд - это значение по умолчанию для этого свойства , но поскольку BufferedWaveProvider
использует кольцевой буфер , поэтому BufferLength
- это все данные, которые у него есть.
То, что сработало для меня, было пропустить BufferedWaveProvider
и записать новые данные в WaveFileWriter
, как только он станет доступным ...
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
writer.Write(e.Buffer, 0, e.BytesRecorded);
}
Чтобы поддержать это изменение, обработчики событий кнопки меняются на следующие ...
private void btnRecordVoice_Click(object sender, EventArgs e)
{
if (NAudio.Wave.WaveIn.DeviceCount < 1)
{
Console.WriteLine("No se encuentra un microfono!");
return;
}
writer = new WaveFileWriter(output, waveIn.WaveFormat);
waveIn.StartRecording();
btnRecordVoice.Enabled = false;
btnSave.Enabled = true;
}
private void btnSave_Click(object sender, EventArgs e)
{
waveIn.StopRecording();
writer.Close();
writer = null;
btnRecordVoice.Enabled = false;
btnSave.Enabled = false;
reader = new WaveFileReader("audio.raw"); // (new MemoryStream(bytes));
waveOut.Init(reader);
waveOut.PlaybackStopped += new EventHandler<StoppedEventArgs>(waveOut_PlaybackStopped);
waveOut.Play();
}
Похоже, что тот же подход используется в Запись WAV-файла в приложении WinForms с WaveIn .