Browse Source

zhao:1增加视频转码 2修改录屏倒计时 3修改缩略图名

tags/录制修改前
耀 4 years ago
parent
commit
2e68dc4f25

+ 17
- 1
Common/system/BlackboardNew.cs View File

319
                 if (stroke != null && stroke.StylusPoints.Count > 1)
319
                 if (stroke != null && stroke.StylusPoints.Count > 1)
320
                 {
320
                 {
321
                     isFirst = true;
321
                     isFirst = true;
322
-                    strokes_page_all[i].lines.Last().lines_curr.Add(stroke);
322
+                    try
323
+                    {
324
+                        strokes_page_all[i].lines.Last().lines_curr.Add(stroke);
325
+                    }
326
+                    catch (Exception ex)
327
+                    {
328
+                        if (strokes_page_all != null)
329
+                        {
330
+                            if (strokes_page_all.Count == 0)
331
+                            {
332
+                                ZBBPage pagetemp = new ZBBPage();
333
+                                pagetemp.lines.Add(new ZBBPageStep());
334
+                                strokes_page_all.Add(pagetemp);
335
+                            }
336
+                        }
337
+                        LogHelper.WriteErrLog("【画板】(changepages)添加失败,strokes_page_all为0," + ex.Message, ex);
338
+                    }
323
                 }
339
                 }
324
                 stylusPoints = new StylusPointCollection();
340
                 stylusPoints = new StylusPointCollection();
325
                 stylusPoint = new StylusPoint();
341
                 stylusPoint = new StylusPoint();

+ 178
- 100
Common/system/FFMpeg.cs View File

65
             {
65
             {
66
 
66
 
67
             }
67
             }
68
-            if(StartRecordSpeakerAudio(audioSpeakerPath))
68
+            if (StartRecordSpeakerAudio(audioSpeakerPath))
69
             {
69
             {
70
                 IsRecordSpeaker = true;
70
                 IsRecordSpeaker = true;
71
             }
71
             }
94
             {
94
             {
95
                 SpeakerStr = "-f dshow -i audio=\"virtual-audio-capturer\" ";
95
                 SpeakerStr = "-f dshow -i audio=\"virtual-audio-capturer\" ";
96
             }
96
             }
97
-            if(IsRecordMicrophone)
97
+            if (IsRecordMicrophone)
98
             {
98
             {
99
                 MicrophoneName = GetMicrophone();
99
                 MicrophoneName = GetMicrophone();
100
                 if (!string.IsNullOrWhiteSpace(MicrophoneName))
100
                 if (!string.IsNullOrWhiteSpace(MicrophoneName))
118
                     break;
118
                     break;
119
                 case ".AVI":
119
                 case ".AVI":
120
                 case ".FLV":
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
                     //if (string.IsNullOrWhiteSpace(MicrophoneName))
122
                     //if (string.IsNullOrWhiteSpace(MicrophoneName))
123
                     //{
123
                     //{
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的参数
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
             myProcess = new Process();
204
             myProcess = new Process();
205
             LogPath = CreateffmpegLog();
205
             LogPath = CreateffmpegLog();
206
             this.myProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath(@"/ffmpeg/bin/ffmpeg.exe");   //ffmpeg.exe的绝对路径
206
             this.myProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath(@"/ffmpeg/bin/ffmpeg.exe");   //ffmpeg.exe的绝对路径
207
-            if(IsRecordSpeaker && IsRecordMicrophone)
207
+            if (IsRecordSpeaker && IsRecordMicrophone)
208
             {
208
             {
209
                 myProcess.StartInfo.Arguments = "-f dshow -i audio=\"virtual-audio-capturer\"  -f dshow -i audio=\"" +
209
                 myProcess.StartInfo.Arguments = "-f dshow -i audio=\"virtual-audio-capturer\"  -f dshow -i audio=\"" +
210
                         MicrophoneName + "\" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 " + PathName;
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
                 myProcess.StartInfo.Arguments = "-f dshow -i audio=\"virtual-audio-capturer\" " + PathName;
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
                 if (!string.IsNullOrWhiteSpace(MicrophoneName))
219
                 if (!string.IsNullOrWhiteSpace(MicrophoneName))
304
         /// <param name="Frequency">每秒帧率</param>
304
         /// <param name="Frequency">每秒帧率</param>
305
         /// <param name="VideoWidth">视频宽度</param>
305
         /// <param name="VideoWidth">视频宽度</param>
306
         /// <param name="VideoHeight">视频高度</param>
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
             //new Thread(new ThreadStart(new Action(() =>
309
             //new Thread(new ThreadStart(new Action(() =>
310
             //{
310
             //{
322
                 KillProcess.Kill();
322
                 KillProcess.Kill();
323
             }
323
             }
324
             myProcess = new Process();
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
             //Dispatcher.Invoke(() =>
405
             //Dispatcher.Invoke(() =>
397
             //{
406
             //{
398
             //});
407
             //});
552
         /// </summary>
561
         /// </summary>
553
         /// <param name="VideoPath">视频地址</param>
562
         /// <param name="VideoPath">视频地址</param>
554
         /// <param name="ImagePath">图片地址</param>
563
         /// <param name="ImagePath">图片地址</param>
555
-        public void GenerateThumbnails(string VideoPath, string ImagePath)
564
+        public bool GenerateThumbnails(string VideoPath, string ImagePath)
556
         {
565
         {
557
             while (myProcess != null)
566
             while (myProcess != null)
558
             {
567
             {
563
             {
572
             {
564
                 KillProcess.Kill();
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
         /// <summary>
676
         /// <summary>
781
             {
859
             {
782
                 if (waveIn != null)
860
                 if (waveIn != null)
783
                 {
861
                 {
784
-                    waveIn.StopRecording(); 
862
+                    waveIn.StopRecording();
785
                 }
863
                 }
786
                 if (capture != null)
864
                 if (capture != null)
787
                 {
865
                 {

+ 10
- 0
XHWK.WKTool/FileDirectoryWindow.xaml.cs View File

455
             string filePathName = model_Video.VideoPath;
455
             string filePathName = model_Video.VideoPath;
456
             string filePath = FileToolsCommon.GetDirectoryName(filePathName);
456
             string filePath = FileToolsCommon.GetDirectoryName(filePathName);
457
             string newFilePathName = filePath + NewName;
457
             string newFilePathName = filePath + NewName;
458
+            //缩略图
459
+            string ThumbnailPath = filePath + "ThumbnailPath/";
460
+            FileToolsCommon.CreateDirectory(ThumbnailPath);
461
+            //缩略图存储位置
462
+            string ThumbnailPathName = ThumbnailPath + NewName.Replace(".", "") + ".JPG";
458
             if (FileToolsCommon.IsExistFile(newFilePathName))
463
             if (FileToolsCommon.IsExistFile(newFilePathName))
459
             {
464
             {
460
                 Errmessage = "文件已存在,请重新修改文件名!";
465
                 Errmessage = "文件已存在,请重新修改文件名!";
462
             }
467
             }
463
             else
468
             else
464
             {
469
             {
470
+                //修改文件名
465
                 FileToolsCommon.Copy(filePathName, newFilePathName);
471
                 FileToolsCommon.Copy(filePathName, newFilePathName);
466
                 model_Video.VideoPath = newFilePathName;
472
                 model_Video.VideoPath = newFilePathName;
473
+                //修改缩略图名
474
+                FileToolsCommon.DeleteFile(ThumbnailPathName);
475
+                FileToolsCommon.Copy(model_Video.ThumbnailPath, ThumbnailPathName);
476
+                model_Video.ThumbnailPath = ThumbnailPathName;
467
                 APP.SaveWkData();
477
                 APP.SaveWkData();
468
                 return true;
478
                 return true;
469
             }
479
             }

+ 19
- 15
XHWK.WKTool/ScreenRecordingToolbarWindow.xaml.cs View File

299
                     SetUpVideoPathName();
299
                     SetUpVideoPathName();
300
                     IsFirstRS = false;
300
                     IsFirstRS = false;
301
                     k_hook.Start();//安装键盘钩子
301
                     k_hook.Start();//安装键盘钩子
302
+
303
+                    if (APP.W_CountdownWindow == null)
304
+                    {
305
+                        APP.W_CountdownWindow = new CountdownWindow();
306
+                        APP.W_CountdownWindow.Initialize(true, 1800);
307
+                        //APP.W_CountdownWindow.Topmost = true;
308
+                    }
309
+                    else
310
+                    {
311
+                        APP.W_CountdownWindow.Initialize(true, 1800);
312
+                        //APP.W_CountdownWindow.Topmost = true;
313
+                    }
314
+                    APP.W_CountdownWindow.Show();
302
                 }
315
                 }
303
                 IsSuspend = false;
316
                 IsSuspend = false;
304
 
317
 
329
                 txbTime.Visibility = Visibility.Visible;//时间显示
342
                 txbTime.Visibility = Visibility.Visible;//时间显示
330
                 try
343
                 try
331
                 {
344
                 {
332
-                    if (APP.W_CountdownWindow == null)
333
-                    {
334
-                        APP.W_CountdownWindow = new CountdownWindow();
335
-                        APP.W_CountdownWindow.Initialize(true, 1800);
336
-                        //APP.W_CountdownWindow.Topmost = true;
337
-                    }
338
-                    else
339
-                    {
340
-                        APP.W_CountdownWindow.Initialize(true, 1800);
341
-                        //APP.W_CountdownWindow.Topmost = true;
342
-                    }
343
-                    APP.W_CountdownWindow.Show();
344
                     new Thread(new ThreadStart(new Action(() =>
345
                     new Thread(new ThreadStart(new Action(() =>
345
                     {
346
                     {
346
-                        Thread.Sleep(1000);
347
+                        if (IsFirstRS)
348
+                        {
349
+                            Thread.Sleep(1500);
350
+                        }
347
                         APP.FFmpeg.StartRecordingVideo(VideoSavePathName);
351
                         APP.FFmpeg.StartRecordingVideo(VideoSavePathName);
348
 
352
 
349
-                        Thread.Sleep(1800);
353
+                        Thread.Sleep(1000);
350
                         Dispatcher.Invoke(() =>
354
                         Dispatcher.Invoke(() =>
351
                         {
355
                         {
352
                             Stack();
356
                             Stack();
438
                     string ThumbnailPath = FileToolsCommon.GetDirectoryName(VideoSavePathName) + "ThumbnailPath/";
442
                     string ThumbnailPath = FileToolsCommon.GetDirectoryName(VideoSavePathName) + "ThumbnailPath/";
439
                     FileToolsCommon.CreateDirectory(ThumbnailPath);
443
                     FileToolsCommon.CreateDirectory(ThumbnailPath);
440
                     //缩略图存储位置
444
                     //缩略图存储位置
441
-                    string ThumbnailPathName = ThumbnailPath + FileToolsCommon.GetIOFileNameNoExtension(VideoSavePathName) + ".JPG";
445
+                    string ThumbnailPathName = ThumbnailPath + FileToolsCommon.GetIOFileName(VideoSavePathName).Replace(".","") + ".JPG";
442
                     new Thread(new ThreadStart(new Action(() =>
446
                     new Thread(new ThreadStart(new Action(() =>
443
                     {
447
                     {
444
                         while (!FileToolsCommon.IsExistFile(VideoSavePathName))
448
                         while (!FileToolsCommon.IsExistFile(VideoSavePathName))

+ 93
- 17
XHWK.WKTool/XHMicroLessonSystemWindow.xaml.cs View File

1613
                 APP.myloading.Hide();
1613
                 APP.myloading.Hide();
1614
             }
1614
             }
1615
         }
1615
         }
1616
+
1617
+        /// <summary>
1618
+        /// 修改文件名
1619
+        /// </summary>
1620
+        /// <param name="Guid">唯一编号</param>
1621
+        /// <param name="NewName">新文件名带后缀 不带路径</param>
1622
+        /// <param name="Errmessage">错误信息</param>
1623
+        /// <returns></returns>
1624
+        bool ModifyPathName(string FileGuid, string NewName, out string Errmessage)
1625
+        {
1626
+            Errmessage = "";
1627
+            Model_Video model_Video = APP.VideoList.Find(x => x.FileGuid == FileGuid);
1628
+            string filePathName = model_Video.VideoPath;
1629
+            string filePath = FileToolsCommon.GetDirectoryName(filePathName);
1630
+            string newFilePathName = filePath + NewName;
1631
+            //缩略图
1632
+            string ThumbnailPath = filePath + "ThumbnailPath/";
1633
+            FileToolsCommon.CreateDirectory(ThumbnailPath);
1634
+            //缩略图存储位置
1635
+            string ThumbnailPathName = ThumbnailPath + NewName.Replace(".", "") + ".JPG";
1636
+            if (FileToolsCommon.IsExistFile(newFilePathName))
1637
+            {
1638
+                Errmessage = "文件已存在,请重新修改文件名!";
1639
+                return false;
1640
+            }
1641
+            else
1642
+            {
1643
+                //修改文件名
1644
+                FileToolsCommon.Copy(filePathName, newFilePathName);
1645
+                model_Video.VideoPath = newFilePathName;
1646
+                //修改缩略图名
1647
+                FileToolsCommon.DeleteFile(ThumbnailPathName);
1648
+                FileToolsCommon.Copy(model_Video.ThumbnailPath, ThumbnailPathName);
1649
+                model_Video.ThumbnailPath = ThumbnailPathName;
1650
+                APP.SaveWkData();
1651
+                return true;
1652
+            }
1653
+        }
1654
+
1616
         #endregion
1655
         #endregion
1617
 
1656
 
1618
         #region 录制窗口
1657
         #region 录制窗口
1634
         /// </summary>
1673
         /// </summary>
1635
         string VideoSavePathName;
1674
         string VideoSavePathName;
1636
         /// <summary>
1675
         /// <summary>
1676
+        /// 视频合成路径名
1677
+        /// </summary>
1678
+        string VideoSynthesisPathName;
1679
+        /// <summary>
1637
         /// 暂停录制
1680
         /// 暂停录制
1638
         /// </summary>
1681
         /// </summary>
1639
         bool IsSuspendR = true;
1682
         bool IsSuspendR = true;
1723
         /// </summary>
1766
         /// </summary>
1724
         private void W_ScreenRecordingToolbarWindow_Click_stopRecordingScreen()
1767
         private void W_ScreenRecordingToolbarWindow_Click_stopRecordingScreen()
1725
         {
1768
         {
1726
-            TxbRecordScreenWord.Text = "保存中";//
1769
+            txbType.Visibility = Visibility.Visible;
1770
+            txbType.Text = "保存中";
1727
             btnScreenRecording.IsEnabled = false;
1771
             btnScreenRecording.IsEnabled = false;
1728
 
1772
 
1729
             new Thread(new ThreadStart(new Action(() =>
1773
             new Thread(new ThreadStart(new Action(() =>
1735
                 Dispatcher.Invoke(() =>
1779
                 Dispatcher.Invoke(() =>
1736
                 {
1780
                 {
1737
                     btnScreenRecording.IsEnabled = true;
1781
                     btnScreenRecording.IsEnabled = true;
1738
-                    TxbRecordScreenWord.Text = "录屏";
1782
+                    txbType.Visibility = Visibility.Hidden;
1783
+                    //TxbRecordScreenWord.Text = "录屏";
1739
                 });
1784
                 });
1740
             }))).Start();
1785
             }))).Start();
1741
 
1786
 
1867
                     FileToolsCommon.CreateDirectory(AudioPathName);
1912
                     FileToolsCommon.CreateDirectory(AudioPathName);
1868
                     AudioPathName += APP.WKData.WkName + ".MP3";
1913
                     AudioPathName += APP.WKData.WkName + ".MP3";
1869
                     VideoSavePathName = APP.WKData.WkPath + APP.WKData.WkName + "_录制." + VideoInfo.VideoType.ToString();
1914
                     VideoSavePathName = APP.WKData.WkPath + APP.WKData.WkName + "_录制." + VideoInfo.VideoType.ToString();
1915
+                    VideoSynthesisPathName = APP.WKData.WkPath  + APP.WKData.WkName + "_录制Syn." + VideoInfo.VideoType.ToString();
1870
                     int num = 1;
1916
                     int num = 1;
1871
                     while (FileToolsCommon.IsExistFile(VideoSavePathName))
1917
                     while (FileToolsCommon.IsExistFile(VideoSavePathName))
1872
                     {
1918
                     {
1873
                         VideoSavePathName = APP.WKData.WkPath + APP.WKData.WkName + "_录制_" + num + "." + VideoInfo.VideoType.ToString();
1919
                         VideoSavePathName = APP.WKData.WkPath + APP.WKData.WkName + "_录制_" + num + "." + VideoInfo.VideoType.ToString();
1920
+                        VideoSynthesisPathName = APP.WKData.WkPath  + APP.WKData.WkName + "_录制Syn_" + num + "." + VideoInfo.VideoType.ToString();
1874
                         num++;
1921
                         num++;
1875
                     }
1922
                     }
1876
 
1923
 
2159
                     string ThumbnailPath = FileToolsCommon.GetDirectoryName(VideoSavePathName) + "ThumbnailPath/";
2206
                     string ThumbnailPath = FileToolsCommon.GetDirectoryName(VideoSavePathName) + "ThumbnailPath/";
2160
                     FileToolsCommon.CreateDirectory(ThumbnailPath);
2207
                     FileToolsCommon.CreateDirectory(ThumbnailPath);
2161
                     //缩略图存储位置
2208
                     //缩略图存储位置
2162
-                    string ThumbnailPathName = ThumbnailPath + FileToolsCommon.GetIOFileNameNoExtension(VideoSavePathName) + ".JPG";
2209
+                    string ThumbnailPathName = ThumbnailPath + FileToolsCommon.GetIOFileName(VideoSavePathName).Replace(".", "") + ".JPG";
2163
                     int gridActWidth = (int)GridMain.ActualWidth;
2210
                     int gridActWidth = (int)GridMain.ActualWidth;
2164
                     int gridActHeight = (int)GridMain.ActualHeight;
2211
                     int gridActHeight = (int)GridMain.ActualHeight;
2165
                     APP.FFmpeg.StopFFmpeg(AudioPathName);
2212
                     APP.FFmpeg.StopFFmpeg(AudioPathName);
2174
                         {
2221
                         {
2175
                             IsStartCount = false;
2222
                             IsStartCount = false;
2176
                             timer.Stop();
2223
                             timer.Stop();
2224
+                            End();
2225
+                            txbTime.Text = "";
2226
+                            txbTime.Visibility = Visibility.Hidden;
2177
                         });
2227
                         });
2178
                         //}))).Start();
2228
                         //}))).Start();
2179
                         //new Thread(new ThreadStart(new Action(() =>
2229
                         //new Thread(new ThreadStart(new Action(() =>
2195
                             //没有录制音频
2245
                             //没有录制音频
2196
                             AudioPathName = null;
2246
                             AudioPathName = null;
2197
                         }
2247
                         }
2198
-                        APP.FFmpeg.SynthesisVideo(ImgPath, AudioPathName, VideoSavePathName, 5, gridActWidth, gridActHeight);
2248
+                        //合成视频
2249
+                        bool SynRes= APP.FFmpeg.SynthesisVideo(ImgPath, AudioPathName, VideoSynthesisPathName, 5, gridActWidth, gridActHeight);
2199
                         //}))).Start();
2250
                         //}))).Start();
2200
                         //new Thread(new ThreadStart(new Action(() =>
2251
                         //new Thread(new ThreadStart(new Action(() =>
2201
                         //{
2252
                         //{
2202
-                        while (!FileToolsCommon.IsExistFile(VideoSavePathName))
2253
+                        if(!SynRes)
2203
                         {
2254
                         {
2204
-                            Thread.Sleep(100);
2255
+                            Dispatcher.Invoke(() =>
2256
+                            {
2257
+                                MessageWindow.Show("视频录制失败,无法保存此视频!");
2258
+                                BtnRecord.IsEnabled = true;
2259
+                                btnStop.IsEnabled = true;
2260
+                                TxbRecordingWord.Text = "录制";
2261
+                                txbType.Text = "";
2262
+                            });
2263
+                            return;
2205
                         }
2264
                         }
2206
-                        while (FileToolsCommon.IsExistDirectory(FileToolsCommon.GetDirectoryName(VideoSavePathName) + "temp/"))
2265
+                        Dispatcher.Invoke(() =>
2266
+                        {
2267
+                            txbType.Text = "转码中";
2268
+                        });
2269
+                        while (!FileToolsCommon.IsExistFile(VideoSynthesisPathName))
2207
                         {
2270
                         {
2208
                             Thread.Sleep(100);
2271
                             Thread.Sleep(100);
2209
                         }
2272
                         }
2210
-                        Dispatcher.Invoke(() =>
2273
+                        while (FileToolsCommon.IsExistDirectory(FileToolsCommon.GetDirectoryName(VideoSynthesisPathName) + "temp/"))
2211
                         {
2274
                         {
2212
-                            BtnRecord.IsEnabled = true;
2213
-                            btnStop.IsEnabled = true;
2214
-                            TxbRecordingWord.Text = "录制";
2215
-                            End();
2216
-                            txbTime.Text = "";
2217
-                            txbTime.Visibility = Visibility.Hidden;
2218
-                            txbType.Text = "";
2219
-                        });
2275
+                            Thread.Sleep(100);
2276
+                        }
2220
                         FileToolsCommon.DeleteFile(ThumbnailPathName);
2277
                         FileToolsCommon.DeleteFile(ThumbnailPathName);
2221
                         VideoInfo.RSTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
2278
                         VideoInfo.RSTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
2222
                         Thread.Sleep(500);
2279
                         Thread.Sleep(500);
2223
                         //VideoInfo.VideoSize = FileToolsCommon.GetFileSizeByMB(VideoSavePathName).ToString() + " MB";
2280
                         //VideoInfo.VideoSize = FileToolsCommon.GetFileSizeByMB(VideoSavePathName).ToString() + " MB";
2224
                         VideoInfo.VideoPath = VideoSavePathName;
2281
                         VideoInfo.VideoPath = VideoSavePathName;
2225
                         VideoInfo.ThumbnailPath = ThumbnailPathName;
2282
                         VideoInfo.ThumbnailPath = ThumbnailPathName;
2226
-                        APP.FFmpeg.GenerateThumbnails(VideoSavePathName, ThumbnailPathName);
2283
+                        //生成缩略图
2284
+                        bool ThuRes = APP.FFmpeg.GenerateThumbnails(VideoSynthesisPathName, ThumbnailPathName);
2285
+                        Thread.Sleep(500);
2286
+                        int imgW = (int)GridMain.ActualWidth + (GridMain.ActualWidth % 2 > 0 ? 1 : 0);
2287
+                        int imgH = (int)GridMain.ActualHeight + (GridMain.ActualHeight % 2 > 0 ? 1 : 0);
2288
+                        if (ThuRes)
2289
+                        {
2290
+                            Bitmap bmp = ImageHelper.ReadBitmapFile(ThumbnailPathName);
2291
+                            imgW = (int)bmp.Width + (bmp.Width % 2 > 0 ? 1 : 0);
2292
+                            imgH = (int)bmp.Height + (bmp.Height % 2 > 0 ? 1 : 0);
2293
+                        }
2294
+
2295
+                        APP.FFmpeg.VideoTranscode(VideoSynthesisPathName, VideoSavePathName, imgW, imgH);
2227
                         VideoInfo.FileGuid = Guid.NewGuid().ToString();
2296
                         VideoInfo.FileGuid = Guid.NewGuid().ToString();
2228
                         VideoInfo.IsUpload = false;
2297
                         VideoInfo.IsUpload = false;
2229
                         VideoInfo.Uploaded = 0;
2298
                         VideoInfo.Uploaded = 0;
2232
                         //保存数据
2301
                         //保存数据
2233
                         APP.SaveWkData();
2302
                         APP.SaveWkData();
2234
                         IsFirstR = true;
2303
                         IsFirstR = true;
2304
+                        Dispatcher.Invoke(() =>
2305
+                        {
2306
+                            BtnRecord.IsEnabled = true;
2307
+                            btnStop.IsEnabled = true;
2308
+                            TxbRecordingWord.Text = "录制";
2309
+                            txbType.Text = "";
2310
+                        });
2235
                     }))).Start();
2311
                     }))).Start();
2236
                     //List<Model_Video> VideoList
2312
                     //List<Model_Video> VideoList
2237
                 }
2313
                 }

Loading…
Cancel
Save