2

我正在使用 C# WinForms 制作视频转换器,我正在使用 NReco.VideoConverter 库。它有一个名为 EventHandlerConvertProgress但我从未使用过 EventHandlers,我在互联网上搜索了一些信息,但我仍然不知道如何将它应用到我的应用程序中。

我试过这个:

public static event EventHandler<ConvertProgressEventArgs> _getPercent;
//...
_getPercent += ???
progressBar1.Value = ??

我被困在那里,我不知道该怎么办。有人能帮我吗??提前致谢。

4

2 回答 2

4

首先,摆脱您的自定义事件。您想收听/订阅他们的活动,而不是您的活动。

其次,您需要一个实际的转换器实例,然后订阅它的事件:

FFMpegConverter converter = new FFMpegConverter(); //May not work, for sample only
converter.ConvertProgress += UpdateProgress;

现在您需要一个名为的方法UpdateProgress(您也可以只使用上面的 lambda 表达式):

private void UpdateProgress(object sender, ConvertProgressEventArgs e)
{
}

在该方法的主体中,更新您的进度条。请注意,您需要将更改编组到 UI 线程。在已完成的 Windows 窗体中Control.Invoke

progressBar1.Invoke(new Action(() =>
{
     progressBar1.Value = e.Processed; //Or whatever calculation you want
}));

对于其他人,如果您还没有看到它,这里是该事件的文档:http ://www.nrecosite.com/doc/NReco.VideoConverter/html/E_NReco_VideoConverter_FFMpegConverter_ConvertProgress.htm

于 2015-02-26T22:41:58.627 回答
0

我已经解决了standardError的重定向并在方法中使用streamreader读取。

public double Progress{get;set;}

创建新进程

Process run = new Process();
run.StartInfo.FileName = Path.Combine(path, "ffmpeg.exe");
run.StartInfo.Arguments ="your string with output options";
run.StartInfo.UseShellExecute = false;
run.StartInfo.CreateNoWindow = true;
run.StartInfo.RedirectStandardError = true;
run.Start();
StreamReader sr = run.StandardError;
while (!sr.EndOfStream)
{
    getTotalSecondProcessed(sr.ReadLine());
}

并重定向输出

private void getTotalSecondProcessed(string v)
{
   try
   {
       string[] split = v.Split(' ');
       foreach (var row in split)
       {
           if (row.StartsWith("time="))
           {
               var time = row.Split('=');
               Progress = TimeSpan.Parse(time[1]).TotalSeconds;
           }
       }      
       catch{}
   }

在 WinForm 中创建一个由 timer_Tick 调用的方法

private void timer1_Tick(object sender, EventArgs e)
    {
        try
        {        
            int progress = int.Parse(utilityVideo.Progress.ToString("0"));

            if (progress > 0)
            {
                RefreshProgressBar(Progress);
            }
        }                
    }
    catch { }
    }

private void RefreshProgressBar(int currentTimeProcessed)
    {
        if (InvokeRequired)
        {
            BeginInvoke((MethodInvoker)delegate { RefreshProgressBar(currentTimeProcessed); });
            return;
        }
        progressBar1.Value = currentTimeProcessed;
    }
于 2017-11-23T15:25:01.570 回答