Остановите звукозапись самостоятельно после временной задержки в c # (используя NAudio) - PullRequest
1 голос
/ 17 ноября 2010

Я делаю звук, записанный с помощью 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.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

Одна вещь, которую вы можете иметь в виду - будет DataAvailable обратный вызов после вызова на StopRecording (или во время, в зависимости от используемой модели обратного вызова), так что вы можете захотетьотложить закрытие WaveFileWriter до тех пор, пока вы не напишите все.

Посмотрите пример проекта VoiceRecorder , который использует 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();
2 голосов
/ 17 ноября 2010

используйте Таймер , установите 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;
}
...