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