80 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								using System;
							 | 
						|||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						|||
| 
								 | 
							
								using System.Diagnostics;
							 | 
						|||
| 
								 | 
							
								using System.IO;
							 | 
						|||
| 
								 | 
							
								using System.Linq;
							 | 
						|||
| 
								 | 
							
								using System.Text;
							 | 
						|||
| 
								 | 
							
								using System.Threading;
							 | 
						|||
| 
								 | 
							
								using System.Threading.Tasks;
							 | 
						|||
| 
								 | 
							
								using System.Windows;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace DM_Weight.util
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    public class FFmpegHelper
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private Process _ffmpegProcess;
							 | 
						|||
| 
								 | 
							
								        private string _ffmpegPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ffmpeg.exe");
							 | 
						|||
| 
								 | 
							
								        //是否停止录屏标志
							 | 
						|||
| 
								 | 
							
								        public bool stopFlag = false;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public void StartRecording(string outputPath, int frameRate = 30)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            //int width = (int)SystemParameters.PrimaryScreenWidth;
							 | 
						|||
| 
								 | 
							
								            //int height =(int)SystemParameters.PrimaryScreenHeight;
							 | 
						|||
| 
								 | 
							
								            int segmentDuration = 1800; // 每段半小时
							 | 
						|||
| 
								 | 
							
								            string args = $"-f gdigrab -framerate {frameRate} " +
							 | 
						|||
| 
								 | 
							
								                         $"-i desktop -preset ultrafast -t {segmentDuration} {outputPath}";
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            _ffmpegProcess = new Process
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                StartInfo = new ProcessStartInfo
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    FileName = _ffmpegPath,
							 | 
						|||
| 
								 | 
							
								                    Arguments = args,
							 | 
						|||
| 
								 | 
							
								                    UseShellExecute = false,
							 | 
						|||
| 
								 | 
							
								                    CreateNoWindow = true,
							 | 
						|||
| 
								 | 
							
								                    RedirectStandardInput = true
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            _ffmpegProcess.Start();
							 | 
						|||
| 
								 | 
							
								            ThreadPool.QueueUserWorkItem(CheckFFmpegProcess); // 检查FFmpeg进程是否完成,以开始下一个录制段
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public void StopRecording()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            _ffmpegProcess?.StandardInput.WriteLine("q");
							 | 
						|||
| 
								 | 
							
								            _ffmpegProcess?.WaitForExit(1000);
							 | 
						|||
| 
								 | 
							
								            _ffmpegProcess?.Close();
							 | 
						|||
| 
								 | 
							
								            stopFlag = true;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        private void CheckFFmpegProcess(object state)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                if (!stopFlag)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    _ffmpegProcess.WaitForExit(); // 等待FFmpeg进程结束
							 | 
						|||
| 
								 | 
							
								                    if (!_ffmpegProcess.HasExited) return; // 如果进程未结束,则不继续
							 | 
						|||
| 
								 | 
							
								                                                           // 开始下一个录制段,如果需要循环录制,可以取消注释下面的代码行并适当调整逻辑
							 | 
						|||
| 
								 | 
							
								                                                           // StartRecording(); // 注意:这将无限循环录制,可能需要用户界面干预来停止或重置计数器。
							 | 
						|||
| 
								 | 
							
								                    string _outputFolder;
							 | 
						|||
| 
								 | 
							
								                    string _outputFilePath;
							 | 
						|||
| 
								 | 
							
								                    _outputFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Log", "ScreenRecordings");
							 | 
						|||
| 
								 | 
							
								                    if (!Directory.Exists(_outputFolder))
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        Directory.CreateDirectory(_outputFolder);
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                    // 生成输出文件名
							 | 
						|||
| 
								 | 
							
								                    string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
							 | 
						|||
| 
								 | 
							
								                    _outputFilePath = Path.Combine(_outputFolder, $"{timestamp}.webm");
							 | 
						|||
| 
								 | 
							
								                    StartRecording(_outputFilePath, 25);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |