c# - 如何异步流式传输来自ffmpeg的输出

时间:2017-01-23 12:22:07

标签: c# .net asynchronous ffmpeg output

我创建了一个方法来调用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;

        }

1 个答案:

答案 0 :(得分:0)

尝试使用Task,如下所示:

Action action = () =>
                            {
                               //Do your streaming here
                            };

然后开始:

Task t2 = Task.Factory.StartNew(action);

希望这很有用。