Я пытаюсь заставить записывающее устройство NVR захватывать поток RTPS с помощью FFmpeg с графическим интерфейсом.
Но есть проблема: моя программа не будет обновлять элемент пользовательского интерфейса.
Я уже общался с gpt, но не помог.
Код: Выделить всё
public void Record()
{
string Camera_Default_File_Save = $"{Camera_Record_Time.Day}-{Camera_Record_Time.Month}-{Camera_Record_Time.Year} + {Camera_Record_Time.Hour}-{Camera_Record_Time.Minute}-{Camera_Record_Time.Second}";
NVR_Global_Value.Camera_File_Save = $"NVR_Recoder ({Camera_Default_File_Save}).mp4";
if (!System.IO.File.Exists(NVR_Global_Value.FFmpeg))
{
MessageBox.Show("FFmpeg.exe does not exist");
return;
}
Process ffmpeg = new Process();
ffmpeg.StartInfo.FileName = NVR_Global_Value.FFmpeg;
ffmpeg.StartInfo.Arguments = NVR_Global_Value.FFmpeg_Record_Command;
ffmpeg.StartInfo.RedirectStandardError = true;
ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.CreateNoWindow = true;
ffmpeg.ErrorDataReceived += (s, e) =>
{
if (string.IsNullOrEmpty(e.Data)) return;
var match = System.Text.RegularExpressions.Regex.Match(e.Data, @"size=\s*(\d+)(kB)?\s.*bitrate=\s*([\d\.]+)kbits/s");
if (match.Success)
{
string Data_Size = match.Groups[1].Value;
string Data_Bitrate = match.Groups[3].Value;
this.BeginInvoke(new Action(() =>
{
Text_DataSent.Text = $"Sent: {Data_Bitrate} kb/s"; // My UI element
Text_DataReceive.Text = $"Receive: {Data_Size} kB";
Text_UseStorage.Text = $"Use Storage: {Data_Size} KB";
}));
}
};
ffmpeg.Start();
ffmpeg.BeginErrorReadLine();
}
Код: Выделить всё
class NVR_Global_Value
{
public static string Camera_IP = "";
public static string Camera_Port = "554";
public static string Camera_Mode = "";
public static string Camera_Username = "admin";
public static string Camera_Password = "";
public static string Camera_File_Save = "";
public static string Camera_Folder_Save = "";
public static string Camera_Link
{
get
{
return "rtsp://" + Camera_Username + ":" + Camera_Password + "@" + Camera_IP + ":" + Camera_Port + "/" + Camera_Mode;
}
}
public static string VLC_Executable_Path = "vlc.exe";
public static string FFmpeg = "ffmpeg.exe";
public static string FFmpeg_Record_Command
{
get
{
return $"-i {Camera_Link} -acodec copy -vcodec copy \"{Camera_File_Save}\"";
}
}
}
FFmpeg — это версия 8.0.1. Я новичок в C #, поэтому я плохо пишу код. (Регулярное выражение было предложено в chatgpt.)
FFmpeg запускается и начинает потоковую передачу данных.
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/798 ... is-running
Мобильная версия