Я записываю голос из приложения Windows на временных интервалах. Я сделал класс, чтобы начать и остановить запись голоса и вызвать его функцию в моей форме.Проблема с аудиозаписью с использованием события, прошедшего с помощью Windows Timer
Класс следующего
class VoiceRecording {
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
public VoiceRecording() {
}
public void StartRecording() {
mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
mciSendString("record recsound", "", 0, 0);
}
public void StopRecording(int FileNameCounter) {
mciSendString(String.Format("save recsound {0}", @"E:\WAVFiles\" + FileNameCounter + ".wav"), "", 0, 0);
mciSendString("close recsound ", "", 0, 0);
Computer c = new Computer();
c.Audio.Stop();
}
}
Теперь, когда я называю эти функции на событии нажатия кнопки, как
int FileNameCounter = 1;
private void btnStart_Click(object sender, EventArgs e) {
VR = new VoiceRecording();
VR.StartRecording();
}
private void btnStop_Click(object sender, EventArgs e) {
VR.StopRecording(FileNameCounter++);
VR = null;
}
все идет хорошо, независимо от того, насколько медленно или быстро я нажимаю кнопки, то код всегда создает пронумерованные файлы.
Я поставил код в петлю, а как
for (int i = 0; i < 10; i++) {
VR = new VoiceRecording();
VR.StartRecording();
VR.StopRecording(FileNameCounter++);
VR = null;
}
он также хорошо работает и создает 10 пронумерованных файлов.
До сих пор все в порядке, а вот я представил Таймера как этот
System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new ElapsedEventHandler(TimerEvent);
t.Interval = 10000;
t.Start();
private bool RecordingStarted = false;
private void TimerEvent(object sender, ElapsedEventArgs e) {
if (RecordingStarted) {
VR.StopRecording(FileNameCounter++);
VR = null;
RecordingStarted = false;
} else {
VR = new VoiceRecording();
VR.StartRecording();
RecordingStarted = true;
}
}
Теперь проблема, когда код выполняется внутри TimerEvent, он создает файлы, но также отсутствуют некоторые файлы.
Для примера
цикл создает: 1.wav, 2.wav, 3.wav, 4.wav, 5.wav, 6.wav
Таймер Создает: 1.wav, 2.wav, 4.wav, 7.wav, 8.wav, 13.wav
У меня отладка кода, каждый оператор выполняется каждый раз, но иногда файл не создается.
Любая помощь будет высоко оценен :)
Нет опыта в этом, но в своем классе VoiceRecording вы отправляете сообщения в какой-то базовый объект без проверки успеш- ищет пути получения статуса/извлечения ошибок, где я начинать. –
System.Timers.Timer - сложный класс, создающий всевозможные возможности для неразрушающего отказа. Повторное вмешательство всегда сопряжено с риском, его привычка глотать все исключения особенно затруднительна. Просто не используйте его, вам это не нужно. Вместо этого используйте обычный таймер Winforms. –