使用 FFMpeg 显示视频转换的进度
Show progress of a video conversion with FFMpeg
我正在使用 C# WinForms 制作视频转换器,我正在使用 NReco.VideoConverter 库。它有一个名为 ConvertProgress
的事件处理程序,但我从未使用过事件处理程序,我在互联网上搜索了一些信息,但我仍然不知道如何将它应用到我的应用程序中。
我试过这个:
public static event EventHandler<ConvertProgressEventArgs> _getPercent;
//...
_getPercent += ???
progressBar1.Value = ??
我被困在那里,不知道该怎么办。有人能帮我吗??提前致谢。
首先,删除您的自定义事件。你想 listen/subscribe 到 他们的 活动,而不是你的。
其次,您需要转换器的实际实例,然后订阅它的事件:
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
我已经解决了标准错误的重定向,并在一个方法中使用流阅读器读取。
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;
}
我正在使用 C# WinForms 制作视频转换器,我正在使用 NReco.VideoConverter 库。它有一个名为 ConvertProgress
的事件处理程序,但我从未使用过事件处理程序,我在互联网上搜索了一些信息,但我仍然不知道如何将它应用到我的应用程序中。
我试过这个:
public static event EventHandler<ConvertProgressEventArgs> _getPercent;
//...
_getPercent += ???
progressBar1.Value = ??
我被困在那里,不知道该怎么办。有人能帮我吗??提前致谢。
首先,删除您的自定义事件。你想 listen/subscribe 到 他们的 活动,而不是你的。
其次,您需要转换器的实际实例,然后订阅它的事件:
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
我已经解决了标准错误的重定向,并在一个方法中使用流阅读器读取。
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;
}