在WPF中编写的代码中,我在FFmpeg中运行了一些过滤器,如果我在终端中运行命令(PowerShell或cmd提示符),它将逐行为我提供信息。
我正在从C#代码调用该过程,并且工作正常。我的代码存在的问题实际上是我无法从运行的进程中获取任何输出。
我从FFmpeg进程的StackOverflow中尝试了一些答案。我在代码中看到2个机会。我可以通过Timer方法修复它,或者再将事件挂接到OutputDataReceived。
我尝试了OutputDataReceived事件,但我的代码无法正常工作。我尝试了Timer Approach,但是仍然没有达到我的代码。请检查下面的代码
_process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = ffmpeg,
Arguments = arguments,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
},
EnableRaisingEvents = true
};
_process.OutputDataReceived += Proc_OutputDataReceived;
_process.Exited += (a, b) =>
{
System.Threading.Tasks.Task.Run(() =>
{
System.Threading.Tasks.Task.Delay(5000);
System.IO.File.Delete(newName);
});
//System.IO.File.Delete()
};
_process.Start();
_timer = new Timer();
_timer.Interval = 500;
_timer.Start();
_timer.Tick += Timer_Tick;
}
private void Timer_Tick(object sender, EventArgs e)
{
while (_process.StandardOutput.EndOfStream)
{
string line = _process.StandardOutput.ReadLine();
}
// Check the process.
}
答案 0 :(得分:2)
ffmpeg似乎在StandardError而不是StandardOutput上输出状态更新。
我设法使用以下代码从中获取更新:
process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = ffmpeg,
Arguments = args,
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = false,
RedirectStandardError = true
},
EnableRaisingEvents = true
};
process.Start();
string processOutput = null;
while ((processOutput = process.StandardError.ReadLine()) != null)
{
// do something with processOutput
Debug.WriteLine(processOutput);
}