我创建了一个方法来调用ffmpeg二进制文件并为我做一些事情。它在标准控制台应用程序上运行得非常好。我正在尝试制作Windows窗体应用程序版本,但几乎没有问题。当ffmpeg进程仍在运行时,应用程序冻结(但进度条仍在更新)。文本框未更新。我无法移动应用程序窗口。我怀疑这是因为循环,我搜索了一些东西,发现我可能需要异步执行此操作,但我该怎么做呢。
public void ffmpeg(string ffmpeg_exe, string args)
{
Process p = new Process();
p.StartInfo.FileName = ffmpeg_exe;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Arguments = args;
p.StartInfo.UseShellExecute = false;
p.Start();
StreamReader reader = p.StandardError;
string line;
string size = "", current_duration = "", duration = "";
while ((line = reader.ReadLine()) != null)
{
if (!string.IsNullOrEmpty(line))
{
if (line.Contains("Duration") && line.Contains("bitrate") && line.Contains("start"))
{
duration = RemoveWhitespace(Between(line, "Duration:", ", start"));
totaltime.Text = duration;
}
if (line.Contains("frame=") && line.Contains("size=") && line.Contains("time="))
{
size = RemoveWhitespace(Between(line, "size=", " time"));
current_duration = RemoveWhitespace(Between(line, "time=", " bitrate"));
progressBar_main.Value = Convert.ToInt32(Math.Round(TimeSpan.Parse(current_duration.Substring(0, current_duration.Length -3)).TotalSeconds * 100 / TimeSpan.Parse(duration.Substring(0,duration.Length-3)).TotalSeconds, 3));
current_time.Text = current_duration;
filesize.Text = size;
}
}
}
p.Close();
current_time.Text = "";
filesize.Text = "";
totaltime.Text = "";
progressBar_main.Value = 0;
}
答案 0 :(得分:0)
尝试使用Task
,如下所示:
Action action = () =>
{
//Do your streaming here
};
然后开始:
Task t2 = Task.Factory.StartNew(action);
希望这很有用。