|
@@ -65,7 +65,7 @@ namespace Common.system
|
65
|
65
|
{
|
66
|
66
|
|
67
|
67
|
}
|
68
|
|
- if(StartRecordSpeakerAudio(audioSpeakerPath))
|
|
68
|
+ if (StartRecordSpeakerAudio(audioSpeakerPath))
|
69
|
69
|
{
|
70
|
70
|
IsRecordSpeaker = true;
|
71
|
71
|
}
|
|
@@ -94,7 +94,7 @@ namespace Common.system
|
94
|
94
|
{
|
95
|
95
|
SpeakerStr = "-f dshow -i audio=\"virtual-audio-capturer\" ";
|
96
|
96
|
}
|
97
|
|
- if(IsRecordMicrophone)
|
|
97
|
+ if (IsRecordMicrophone)
|
98
|
98
|
{
|
99
|
99
|
MicrophoneName = GetMicrophone();
|
100
|
100
|
if (!string.IsNullOrWhiteSpace(MicrophoneName))
|
|
@@ -118,7 +118,7 @@ namespace Common.system
|
118
|
118
|
break;
|
119
|
119
|
case ".AVI":
|
120
|
120
|
case ".FLV":
|
121
|
|
- myProcess.StartInfo.Arguments = SpeakerStr + MicrophoneStr + " -f dshow -i video=\"screen-capture-recorder\" -pix_fmt yuv420p -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec aac -f " + Extension.ToLower().Replace(".","") + " " + PathName;
|
|
121
|
+ myProcess.StartInfo.Arguments = SpeakerStr + MicrophoneStr + " -f dshow -i video=\"screen-capture-recorder\" -pix_fmt yuv420p -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec aac -f " + Extension.ToLower().Replace(".", "") + " " + PathName;
|
122
|
122
|
//if (string.IsNullOrWhiteSpace(MicrophoneName))
|
123
|
123
|
//{
|
124
|
124
|
// myProcess.StartInfo.Arguments = "-f dshow -i video=\"screen-capture-recorder\" -f dshow -i audio=\"virtual-audio-capturer\" -vcodec libx264 -acodec libmp3lame -r 15 -crf 22 -f " + Extension.ToLower() + " " + PathName; //ffmpeg的参数
|
|
@@ -204,16 +204,16 @@ namespace Common.system
|
204
|
204
|
myProcess = new Process();
|
205
|
205
|
LogPath = CreateffmpegLog();
|
206
|
206
|
this.myProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath(@"/ffmpeg/bin/ffmpeg.exe"); //ffmpeg.exe的绝对路径
|
207
|
|
- if(IsRecordSpeaker && IsRecordMicrophone)
|
|
207
|
+ if (IsRecordSpeaker && IsRecordMicrophone)
|
208
|
208
|
{
|
209
|
209
|
myProcess.StartInfo.Arguments = "-f dshow -i audio=\"virtual-audio-capturer\" -f dshow -i audio=\"" +
|
210
|
210
|
MicrophoneName + "\" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 " + PathName;
|
211
|
211
|
}
|
212
|
|
- else if(IsRecordSpeaker)
|
|
212
|
+ else if (IsRecordSpeaker)
|
213
|
213
|
{
|
214
|
214
|
myProcess.StartInfo.Arguments = "-f dshow -i audio=\"virtual-audio-capturer\" " + PathName;
|
215
|
215
|
}
|
216
|
|
- else if(IsRecordMicrophone)
|
|
216
|
+ else if (IsRecordMicrophone)
|
217
|
217
|
{
|
218
|
218
|
//录制麦克风
|
219
|
219
|
if (!string.IsNullOrWhiteSpace(MicrophoneName))
|
|
@@ -304,7 +304,7 @@ namespace Common.system
|
304
|
304
|
/// <param name="Frequency">每秒帧率</param>
|
305
|
305
|
/// <param name="VideoWidth">视频宽度</param>
|
306
|
306
|
/// <param name="VideoHeight">视频高度</param>
|
307
|
|
- public void SynthesisVideo(string ImageListPath, string Mp3Path, string VideoSavePath, int Frequency, int VideoWidth, int VideoHeight)
|
|
307
|
+ public bool SynthesisVideo(string ImageListPath, string Mp3Path, string VideoSavePath, int Frequency, int VideoWidth, int VideoHeight)
|
308
|
308
|
{
|
309
|
309
|
//new Thread(new ThreadStart(new Action(() =>
|
310
|
310
|
//{
|
|
@@ -322,77 +322,86 @@ namespace Common.system
|
322
|
322
|
KillProcess.Kill();
|
323
|
323
|
}
|
324
|
324
|
myProcess = new Process();
|
325
|
|
- LogPath = CreateffmpegLog();
|
326
|
|
- string mp3Str = "";
|
327
|
|
- #region 判断音频是否存在
|
328
|
|
- if (!string.IsNullOrWhiteSpace(Mp3Path))
|
|
325
|
+ try
|
329
|
326
|
{
|
330
|
|
- if (FileToolsCommon.IsExistFile(Mp3Path))
|
|
327
|
+
|
|
328
|
+ LogPath = CreateffmpegLog();
|
|
329
|
+ string mp3Str = "";
|
|
330
|
+ #region 判断音频是否存在
|
|
331
|
+ if (!string.IsNullOrWhiteSpace(Mp3Path))
|
331
|
332
|
{
|
332
|
|
- mp3Str = "-i " + Mp3Path;
|
|
333
|
+ if (FileToolsCommon.IsExistFile(Mp3Path))
|
|
334
|
+ {
|
|
335
|
+ mp3Str = "-i " + Mp3Path;
|
|
336
|
+ }
|
333
|
337
|
}
|
334
|
|
- }
|
335
|
|
- #endregion
|
336
|
|
- this.myProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath(@"/ffmpeg/bin/ffmpeg.exe"); //ffmpeg.exe的绝对路径
|
337
|
|
- switch (Extension.ToUpper())
|
338
|
|
- {
|
339
|
|
- case ".MP4":
|
340
|
|
- myProcess.StartInfo.Arguments = @"-y -r " + Frequency + " -i " +
|
341
|
|
- ImageListPath + @"%d.png " +
|
342
|
|
- mp3Str + @" -s " + VideoWidth + "x" + VideoHeight + " -vcodec mpeg4 " +
|
343
|
|
- VideoSavePath;
|
344
|
|
- break;
|
345
|
|
- case ".AVI":
|
346
|
|
- myProcess.StartInfo.Arguments = @"-y -r " + Frequency + " -i " +
|
347
|
|
- ImageListPath + @"%d.png " +
|
348
|
|
- mp3Str + @" -s " + VideoWidth + "x" + VideoHeight + " -f AVI " +
|
349
|
|
- VideoSavePath;
|
350
|
|
- break;
|
351
|
|
- case ".FLV":
|
352
|
|
- myProcess.StartInfo.Arguments = @"-y -r " + Frequency + " -i " +
|
353
|
|
- ImageListPath + @"%d.png " +
|
354
|
|
- mp3Str + @" -s " + VideoWidth + "x" + VideoHeight + " -f FLV " +
|
355
|
|
- VideoSavePath;
|
356
|
|
- break;
|
357
|
|
- default:
|
358
|
|
- myProcess.StartInfo.Arguments = @"-y -r " + Frequency + " -i " +
|
359
|
|
- ImageListPath + @"%d.png " +
|
360
|
|
- mp3Str + @" -s " + VideoWidth + "x" + VideoHeight + " -vcodec mpeg4 " +
|
361
|
|
- VideoSavePath;
|
362
|
|
- break;
|
363
|
|
- }
|
364
|
|
- myProcess.StartInfo.UseShellExecute = false; //不使用操作系统外壳程序启动
|
365
|
|
- myProcess.StartInfo.RedirectStandardError = true; //重定向标准错误输出
|
366
|
|
- myProcess.StartInfo.CreateNoWindow = true; //不显示程序窗口
|
367
|
|
- myProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入
|
368
|
|
- //外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
|
369
|
|
- myProcess.ErrorDataReceived += new DataReceivedEventHandler(Output);
|
370
|
|
- myProcess.Start(); //启动线程
|
371
|
|
- myProcess.BeginErrorReadLine(); //开始异步读取
|
372
|
|
- myProcess.WaitForExit(); //阻塞等待进程结束
|
373
|
|
- myProcess.Close(); //关闭进程
|
374
|
|
- myProcess.Dispose(); //释放资源
|
375
|
|
- #region 进程是否已经释放
|
376
|
|
- bool IsRunning = true;
|
377
|
|
- while (IsRunning)
|
378
|
|
- {
|
379
|
|
- IsRunning = false;
|
380
|
|
- Process[] ProcessArray = Process.GetProcessesByName("ffmpeg");
|
381
|
|
- foreach (var KillProcess in ProcessArray)
|
|
338
|
+ #endregion
|
|
339
|
+ this.myProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath(@"/ffmpeg/bin/ffmpeg.exe"); //ffmpeg.exe的绝对路径
|
|
340
|
+ switch (Extension.ToUpper())
|
382
|
341
|
{
|
383
|
|
- IsRunning = true;
|
384
|
|
- Thread.Sleep(100);
|
|
342
|
+ case ".MP4":
|
|
343
|
+ myProcess.StartInfo.Arguments = @"-y -r " + Frequency + " -i " +
|
|
344
|
+ ImageListPath + @"%d.png " +
|
|
345
|
+ mp3Str + @" -s " + VideoWidth + "x" + VideoHeight + " -vcodec mpeg4 " +
|
|
346
|
+ VideoSavePath;
|
|
347
|
+ break;
|
|
348
|
+ case ".AVI":
|
|
349
|
+ myProcess.StartInfo.Arguments = @"-y -r " + Frequency + " -i " +
|
|
350
|
+ ImageListPath + @"%d.png " +
|
|
351
|
+ mp3Str + @" -s " + VideoWidth + "x" + VideoHeight + " -f AVI " +
|
|
352
|
+ VideoSavePath;
|
|
353
|
+ break;
|
|
354
|
+ case ".FLV":
|
|
355
|
+ myProcess.StartInfo.Arguments = @"-y -r " + Frequency + " -i " +
|
|
356
|
+ ImageListPath + @"%d.png " +
|
|
357
|
+ mp3Str + @" -s " + VideoWidth + "x" + VideoHeight + " -f FLV " +
|
|
358
|
+ VideoSavePath;
|
|
359
|
+ break;
|
|
360
|
+ default:
|
|
361
|
+ myProcess.StartInfo.Arguments = @"-y -r " + Frequency + " -i " +
|
|
362
|
+ ImageListPath + @"%d.png " +
|
|
363
|
+ mp3Str + @" -s " + VideoWidth + "x" + VideoHeight + " -vcodec mpeg4 " +
|
|
364
|
+ VideoSavePath;
|
|
365
|
+ break;
|
385
|
366
|
}
|
386
|
|
- }
|
387
|
|
- #endregion
|
388
|
|
- myProcess = null;
|
389
|
|
- //生成视频后删除图片和音频保存列表
|
390
|
|
- //FileToolsCommon.DeleteDirectory(ImageListPath);
|
391
|
|
- //FileToolsCommon.DeleteDirectory(FileToolsCommon.GetDirectoryName(Mp3Path));
|
392
|
|
-
|
393
|
|
- Thread.Sleep(100);
|
394
|
|
- FileToolsCommon.DeleteDirectory(FileToolsCommon.GetDirectoryName(VideoSavePath) + "temp");
|
|
367
|
+ myProcess.StartInfo.UseShellExecute = false; //不使用操作系统外壳程序启动
|
|
368
|
+ myProcess.StartInfo.RedirectStandardError = true; //重定向标准错误输出
|
|
369
|
+ myProcess.StartInfo.CreateNoWindow = true; //不显示程序窗口
|
|
370
|
+ myProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入
|
|
371
|
+ //外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
|
|
372
|
+ myProcess.ErrorDataReceived += new DataReceivedEventHandler(Output);
|
|
373
|
+ myProcess.Start(); //启动线程
|
|
374
|
+ myProcess.BeginErrorReadLine(); //开始异步读取
|
|
375
|
+ myProcess.WaitForExit(); //阻塞等待进程结束
|
|
376
|
+ myProcess.Close(); //关闭进程
|
|
377
|
+ myProcess.Dispose(); //释放资源
|
|
378
|
+ #region 进程是否已经释放
|
|
379
|
+ bool IsRunning = true;
|
|
380
|
+ while (IsRunning)
|
|
381
|
+ {
|
|
382
|
+ IsRunning = false;
|
|
383
|
+ Process[] ProcessArray = Process.GetProcessesByName("ffmpeg");
|
|
384
|
+ foreach (var KillProcess in ProcessArray)
|
|
385
|
+ {
|
|
386
|
+ IsRunning = true;
|
|
387
|
+ Thread.Sleep(100);
|
|
388
|
+ }
|
|
389
|
+ }
|
|
390
|
+ #endregion
|
|
391
|
+ myProcess = null;
|
|
392
|
+ //生成视频后删除图片和音频保存列表
|
|
393
|
+ //FileToolsCommon.DeleteDirectory(ImageListPath);
|
|
394
|
+ //FileToolsCommon.DeleteDirectory(FileToolsCommon.GetDirectoryName(Mp3Path));
|
395
|
395
|
|
|
396
|
+ Thread.Sleep(100);
|
|
397
|
+ FileToolsCommon.DeleteDirectory(FileToolsCommon.GetDirectoryName(VideoSavePath) + "temp");
|
|
398
|
+ return true;
|
|
399
|
+ }
|
|
400
|
+ catch (Exception ex)
|
|
401
|
+ {
|
|
402
|
+ LogHelper.WriteErrLog("【视频合成】(SynthesisVideo)视频生成失败," + ex.Message, ex);
|
|
403
|
+ return false;
|
|
404
|
+ }
|
396
|
405
|
//Dispatcher.Invoke(() =>
|
397
|
406
|
//{
|
398
|
407
|
//});
|
|
@@ -552,7 +561,7 @@ namespace Common.system
|
552
|
561
|
/// </summary>
|
553
|
562
|
/// <param name="VideoPath">视频地址</param>
|
554
|
563
|
/// <param name="ImagePath">图片地址</param>
|
555
|
|
- public void GenerateThumbnails(string VideoPath, string ImagePath)
|
|
564
|
+ public bool GenerateThumbnails(string VideoPath, string ImagePath)
|
556
|
565
|
{
|
557
|
566
|
while (myProcess != null)
|
558
|
567
|
{
|
|
@@ -563,36 +572,105 @@ namespace Common.system
|
563
|
572
|
{
|
564
|
573
|
KillProcess.Kill();
|
565
|
574
|
}
|
566
|
|
- myProcess = new Process();
|
567
|
|
- LogPath = CreateffmpegLog();
|
568
|
|
- this.myProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath(@"/ffmpeg/bin/ffmpeg.exe"); //ffmpeg.exe的绝对路径
|
569
|
|
- //myProcess.StartInfo.Arguments = "-i \"" + VideoPath + "\" -ss 1 -vframes 1 -r 1 -ac 1 -ab 2 -s " + thubWidth + "*" + thubHeight + " -f image2 \"" + ImagePath + "\"";
|
570
|
|
- myProcess.StartInfo.Arguments = "-i \"" + VideoPath + "\" -ss 1 -vframes 1 -r 1 -ac 1 -ab 2 -f image2 \"" + ImagePath + "\"";
|
571
|
|
- myProcess.StartInfo.UseShellExecute = false; //不使用操作系统外壳程序启动
|
572
|
|
- myProcess.StartInfo.RedirectStandardError = true; //重定向标准错误输出
|
573
|
|
- myProcess.StartInfo.CreateNoWindow = true; //不显示程序窗口
|
574
|
|
- myProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入
|
575
|
|
- //外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
|
576
|
|
- myProcess.ErrorDataReceived += new DataReceivedEventHandler(Output);
|
577
|
|
- myProcess.Start(); //启动线程
|
578
|
|
- myProcess.BeginErrorReadLine(); //开始异步读取
|
579
|
|
- myProcess.WaitForExit(); //阻塞等待进程结束
|
580
|
|
- myProcess.Close(); //关闭进程
|
581
|
|
- myProcess.Dispose(); //释放资源
|
582
|
|
- #region 进程是否已经释放
|
583
|
|
- bool IsRunning = true;
|
584
|
|
- while (IsRunning)
|
|
575
|
+ try
|
585
|
576
|
{
|
586
|
|
- IsRunning = false;
|
587
|
|
- Process[] ProcessArray = Process.GetProcessesByName("ffmpeg");
|
588
|
|
- foreach (var KillProcess in ProcessArray)
|
|
577
|
+ myProcess = new Process();
|
|
578
|
+ LogPath = CreateffmpegLog();
|
|
579
|
+ this.myProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath(@"/ffmpeg/bin/ffmpeg.exe"); //ffmpeg.exe的绝对路径
|
|
580
|
+ //myProcess.StartInfo.Arguments = "-i \"" + VideoPath + "\" -ss 1 -vframes 1 -r 1 -ac 1 -ab 2 -s " + thubWidth + "*" + thubHeight + " -f image2 \"" + ImagePath + "\"";
|
|
581
|
+ myProcess.StartInfo.Arguments = "-i \"" + VideoPath + "\" -ss 1 -vframes 1 -r 1 -ac 1 -ab 2 -f image2 \"" + ImagePath + "\"";
|
|
582
|
+ myProcess.StartInfo.UseShellExecute = false; //不使用操作系统外壳程序启动
|
|
583
|
+ myProcess.StartInfo.RedirectStandardError = true; //重定向标准错误输出
|
|
584
|
+ myProcess.StartInfo.CreateNoWindow = true; //不显示程序窗口
|
|
585
|
+ myProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入
|
|
586
|
+ //外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
|
|
587
|
+ myProcess.ErrorDataReceived += new DataReceivedEventHandler(Output);
|
|
588
|
+ myProcess.Start(); //启动线程
|
|
589
|
+ myProcess.BeginErrorReadLine(); //开始异步读取
|
|
590
|
+ myProcess.WaitForExit(); //阻塞等待进程结束
|
|
591
|
+ myProcess.Close(); //关闭进程
|
|
592
|
+ myProcess.Dispose(); //释放资源
|
|
593
|
+ #region 进程是否已经释放
|
|
594
|
+ bool IsRunning = true;
|
|
595
|
+ while (IsRunning)
|
589
|
596
|
{
|
590
|
|
- IsRunning = true;
|
591
|
|
- Thread.Sleep(100);
|
|
597
|
+ IsRunning = false;
|
|
598
|
+ Process[] ProcessArray = Process.GetProcessesByName("ffmpeg");
|
|
599
|
+ foreach (var KillProcess in ProcessArray)
|
|
600
|
+ {
|
|
601
|
+ IsRunning = true;
|
|
602
|
+ Thread.Sleep(100);
|
|
603
|
+ }
|
592
|
604
|
}
|
|
605
|
+ #endregion
|
|
606
|
+ myProcess = null;
|
|
607
|
+ return true;
|
|
608
|
+ }
|
|
609
|
+ catch (Exception ex)
|
|
610
|
+ {
|
|
611
|
+ LogHelper.WriteErrLog("【生成缩略图】(GenerateThumbnails)缩略图生成失败," + ex.Message, ex);
|
|
612
|
+ return false;
|
|
613
|
+ }
|
|
614
|
+ }
|
|
615
|
+ /// <summary>
|
|
616
|
+ /// 视频转码
|
|
617
|
+ /// </summary>
|
|
618
|
+ /// <param name="VideoPathName">源视频</param>
|
|
619
|
+ /// <param name="VideoSavePathName">目标视频存储路径</param>
|
|
620
|
+ /// <param name="Width">宽</param>
|
|
621
|
+ /// <param name="Height">高</param>
|
|
622
|
+ /// <returns></returns>
|
|
623
|
+ public bool VideoTranscode(string VideoPathName,string VideoSavePathName,int Width,int Height)
|
|
624
|
+ {
|
|
625
|
+ while (myProcess != null)
|
|
626
|
+ {
|
|
627
|
+ Thread.Sleep(100);
|
|
628
|
+ }
|
|
629
|
+ Process[] KillProcessArray = Process.GetProcessesByName("ffmpeg");
|
|
630
|
+ foreach (var KillProcess in KillProcessArray)
|
|
631
|
+ {
|
|
632
|
+ KillProcess.Kill();
|
|
633
|
+ }
|
|
634
|
+ try
|
|
635
|
+ {
|
|
636
|
+ myProcess = new Process();
|
|
637
|
+ LogPath = CreateffmpegLog();
|
|
638
|
+ this.myProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath(@"/ffmpeg/bin/ffmpeg.exe"); //ffmpeg.exe的绝对路径
|
|
639
|
+ myProcess.StartInfo.Arguments = "-i "+ VideoPathName + " -acodec copy -vcodec libx264 -s "+ Width + "*"+ Height + " "+ VideoSavePathName;
|
|
640
|
+ myProcess.StartInfo.UseShellExecute = false; //不使用操作系统外壳程序启动
|
|
641
|
+ myProcess.StartInfo.RedirectStandardError = true; //重定向标准错误输出
|
|
642
|
+ myProcess.StartInfo.CreateNoWindow = true; //不显示程序窗口
|
|
643
|
+ myProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入
|
|
644
|
+ //外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
|
|
645
|
+ myProcess.ErrorDataReceived += new DataReceivedEventHandler(Output);
|
|
646
|
+ myProcess.Start(); //启动线程
|
|
647
|
+ myProcess.BeginErrorReadLine(); //开始异步读取
|
|
648
|
+ myProcess.WaitForExit(); //阻塞等待进程结束
|
|
649
|
+ myProcess.Close(); //关闭进程
|
|
650
|
+ myProcess.Dispose(); //释放资源
|
|
651
|
+ #region 进程是否已经释放
|
|
652
|
+ bool IsRunning = true;
|
|
653
|
+ while (IsRunning)
|
|
654
|
+ {
|
|
655
|
+ IsRunning = false;
|
|
656
|
+ Process[] ProcessArray = Process.GetProcessesByName("ffmpeg");
|
|
657
|
+ foreach (var KillProcess in ProcessArray)
|
|
658
|
+ {
|
|
659
|
+ IsRunning = true;
|
|
660
|
+ Thread.Sleep(100);
|
|
661
|
+ }
|
|
662
|
+ }
|
|
663
|
+ #endregion
|
|
664
|
+ myProcess = null;
|
|
665
|
+ Thread.Sleep(200);
|
|
666
|
+ FileToolsCommon.DeleteFile(VideoPathName);
|
|
667
|
+ return true;
|
|
668
|
+ }
|
|
669
|
+ catch (Exception ex)
|
|
670
|
+ {
|
|
671
|
+ LogHelper.WriteErrLog("【视频转码】(VideoTranscode)视频转码失败," + ex.Message, ex);
|
|
672
|
+ return false;
|
593
|
673
|
}
|
594
|
|
- #endregion
|
595
|
|
- myProcess = null;
|
596
|
674
|
}
|
597
|
675
|
|
598
|
676
|
/// <summary>
|
|
@@ -781,7 +859,7 @@ namespace Common.system
|
781
|
859
|
{
|
782
|
860
|
if (waveIn != null)
|
783
|
861
|
{
|
784
|
|
- waveIn.StopRecording();
|
|
862
|
+ waveIn.StopRecording();
|
785
|
863
|
}
|
786
|
864
|
if (capture != null)
|
787
|
865
|
{
|