Ответ 1
Вы можете легко реализовать индикатор выполнения при запуске ffmpeg. Вывод ffmpeg во время работы выглядит примерно так:
frame= 3366 fps=465 q=31.0 Lsize= 6474kB time=140.35 bitrate= 377.9kbits/s
И он обновляется ~ два раза в секунду. Вы можете проанализировать эту строку и получить данные, необходимые для отображения прогресса. Когда вы запускаете в командной строке, вы видите только одну строку, которая постоянно обновляется, но то, что ffmpeg делает, это написать строку, за которой следует \r. Вот почему вы не видите несколько строк. Однако при использовании StreamReader.ReadLine() на выходе ошибки программы вы получаете по одной строке для каждого обновления.
Далее следует пример кода для чтения. Вам придется игнорировать любую строку, которая не начинается с "рамки", возможно, используйте BeginErrorReadLine() + ErrorDataReceived, если вы хотите, чтобы строки были асинхронными и т.д., но вы получили идею (я ее протестировал):
using System;
using System.Diagnostics;
using System.IO;
class Test {
static void Main (string [] args)
{
Process proc = new Process ();
proc.StartInfo.FileName = "ffmpeg";
proc.StartInfo.Arguments = "-i " + args [0] + " " + args [1];
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.UseShellExecute = false;
if (!proc.Start ()) {
Console.WriteLine ("Error starting");
return;
}
StreamReader reader = proc.StandardError;
string line;
while ((line = reader.ReadLine ()) != null) {
Console.WriteLine (line);
}
proc.Close ();
}
}