使用Windows Timer已发生事件的音频录制问题

时间:2014-02-05 14:43:09

标签: c# audio timer voice-recording elapsed

我正在按时间间隔从我的Windows应用程序录制语音。我上了课,开始和停止录音并在我的表格上调用它的功能。

课程如下

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中执行时,它正在创建文件,但它也缺少一些文件。

例如
Loop Creates:1.wav,2.wav,3.wav,4.wav,5.wav,6.wav
计时器创建:1.wav,2.wav,4.wav,7.wav,8.wav,13.wav

我已经调试了代码,每次都会执行每个语句,但有时候文件没有被创建。

任何帮助都将受到高度赞赏:)

1 个答案:

答案 0 :(得分:1)

Hans Passant所说

  

System.Timers.Timer是一个困难的类,为不可诊断的失败创造了各种机会。重新入侵总是一种风险,它吞下所有异常的习惯尤其麻烦。只是不使用它,你不需要它。请改用常规的Winforms计时器。

使用Winforms计时器解决了这个问题。现在正在创建编号文件,就像我希望的那样。 :)

谢谢 Hans Passant