80 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			3.2 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;
 | 
						||
            //string args = $"-f gdigrab -framerate 30 -i desktop -c:v libx264 -crf 25 -preset ultrafast -t {segmentDuration} {segmentPath}";
 | 
						||
            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();
 | 
						||
        }
 | 
						||
        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 ex)
 | 
						||
            {
 | 
						||
 | 
						||
            }
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |