Проблема (C# + WinForms: почему мой графический интерфейс не обновляется при запуске FFmpeg?C#

Место общения программистов C#
Ответить
Anonymous
 Проблема (C# + WinForms: почему мой графический интерфейс не обновляется при запуске FFmpeg?

Сообщение Anonymous »

Я пытаюсь заставить записывающее устройство NVR захватывать поток RTPS, используя FFmpeg с графическим интерфейсом. Но у меня проблема: моя программа не обновляет элемент пользовательского интерфейса.
Я уже спрашивал в чате, но это не помогает.
Вот мой код:

Код: Выделить всё

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();
}
Файл: NVR_Global_Value.cs

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»