توقف عن مسجل الصوت من تلقاء نفسه بعد تأخير الوقت في C# (باستخدام Naudio)

StackOverflow https://stackoverflow.com/questions/4203736

  •  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 (أو أثناء ، اعتمادًا على نموذج رد الاتصال المستخدم) ، لذلك قد ترغب في تأخير إغلاق مجاري Wavefilewriter حتى تكتب كل شيء.

ألق نظرة على مسجل الصوت عينة مشروع يستخدم 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();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top