Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用FFMpeg显示视频转换的进度_C#_Ffmpeg_Progress Bar_Encoder_Video Conversion - Fatal编程技术网

C# 使用FFMpeg显示视频转换的进度

C# 使用FFMpeg显示视频转换的进度,c#,ffmpeg,progress-bar,encoder,video-conversion,C#,Ffmpeg,Progress Bar,Encoder,Video Conversion,我正在使用C#WinForms制作视频转换器,我正在使用NReco.VideoConverter库。它有一个名为ConvertProgress的EventHandler,但我从未使用过EventHandler,我在internet上搜索一些信息,但我仍然不知道如何将其应用到我的应用程序中 我试过这个: public static event EventHandler<ConvertProgressEventArgs> _getPercent; //... _getPercent +=

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

我试过这个:

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

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

首先,取消定制活动。你想收听/订阅他们的活动,而不是你的

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

FFMpegConverter converter = new FFMpegConverter(); //May not work, for sample only
converter.ConvertProgress += UpdateProgress;
现在需要一个名为
UpdateProgress
的方法(也可以使用上面的lambda表达式):

在该方法的主体中,更新进度条。请注意,您需要将更改封送到UI线程。在Windows窗体中,使用


对于其他人,如果您还没有看到它,下面是该事件的文档:

我已解决了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中创建一个由计时器调用的方法

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;
    }

@ChrisCreateBoss是的,除非您熟悉事件,否则没有太多帮助:)FFMpeg文档很好,但它们在“使用”方面没有太多示例:(是的,没错……否则,我如何将您的e.Processed转换为整数(progressBar.Value需要一个整数值才能工作)@ChrisCreateBoss该事件还有另一个属性“TotalDuration”。你可以除以它(以获得双精度的完成百分比),并根据进度进行缩放,但我仍然会得到“无法隐式转换类型TimeSpan为int”@ChrisCreateBoss对每个属性使用
TotalMillistics
processed.totalmillizes/total.totalmillizes
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{}
   }
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;
    }