Остановите Audio Recorder самостоятельно после задержки времени в C # (с помощью Naudio)
-
25-09-2019 - |
Вопрос
Я делаю звук, записанный с помощью Naudio в C #, и мне нужно удалить кнопку остановки, и просто остановить запись самостоятельно после некоторой задержки.
Код для регистрации события
private void cmbRecord_Click(object sender, EventArgs e)
{
outputFilename = "file address";
waveInStream = new WaveIn(44100,2);
writer = new WaveFileWriter(outputFilename, waveInStream.WaveFormat);
waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
waveInStream.StartRecording();
// Just controling the objects on the screen.
cmbRecord.Enabled = false;
cmbStop.Enabled = true;
}
void waveInStream_DataAvailable(object sender, WaveInEventArgs e)
{
writer.WriteData(e.Buffer, 0, e.BytesRecorded);
int secondsRecorded = (int)(writer.Length / writer.WaveFormat.AverageBytesPerSecond);
}
Кнопка остановки дана как
private void cmbStop_Click(object sender, EventArgs e)
{
waveInStream.StopRecording();
waveInStream.Dispose();
waveInStream = null;
writer.Close();
writer = null;
cmbRecord.Enabled = true;
cmbStop.Enabled = false;
}
Мне нужно автоматически остановить запись внутри события CMBRECORD_CLICK. Заранее спасибо.
Решение
использовать Таймер, установить Interval
и скопируйте код в cmbStop_Click
Мероприятие вплоть до таймера OnTick
мероприятие. Включить таймер в mbRecord_Click
событие и и не забудьте отключить таймер в cmbStop_Click
мероприятие
Редактировать:
Создайте новый таймер и установите его значение
// Поместите эту строку на уровне класса формы
System.Windows.Forms.Timer mytimer=new System.Windows.Forms.Timer(); //create a new Timer
// Поместите эти два в свой форм конструктор сразу после InitializeComponent()
;
mytimer.Interval=1000; //set the interval to 1 second.
mytimer.Tick += new EventHandler(mytimer_Tick);
Включить таймер в событии MBRECORD_CLICK
private void cmbRecord_Click(object sender, EventArgs e)
{
outputFilename = "file address";
waveInStream = new WaveIn(44100,2);
writer = new WaveFileWriter(outputFilename, waveInStream.WaveFormat);
waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
waveInStream.StartRecording();
// Just controling the objects on the screen.
cmbRecord.Enabled = false;
cmbStop.Enabled = true;
//Enable the timer to fire
mytimer.Enabled = true;
}
Остановите запись после 1 секунды ..
void mytimer_Tick(object sender, EventArgs e)
{
waveInStream.StopRecording();
waveInStream.Dispose();
waveInStream = null;
writer.Close();
writer = null;
cmbRecord.Enabled = true;
cmbStop.Enabled = false;
//disable the timer here so it won't fire again...
mytimer.Enabled = false;
}
Другие советы
Одна вещь, которую вы можете помнить - будет DataAvailable
Перезвоните после призыв к StopRecording
(или во время, в зависимости от используемой модели обратного вызова), так что вы можете задержать закрытие волновогоFileWriter, пока вы не записали все.
Посмотреть на Диктофон Пример проекта, который использует Naudio и останавливает запись через 60 секунд. Я объясню в эта статья Как запись автоматически остановлена.
long maxFileLength = this.recordingFormat.AverageBytesPerSecond * 60;
int toWrite = (int)Math.Min(maxFileLength - writer.Length, bytesRecorded);
if (toWrite > 0)
writer.WriteData(buffer, 0, bytesRecorded);
else
Stop();