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)
|
||
{
|
||
}
|
||
}
|
||
}
|
||
}
|