Możesz łatwo zaimplementować pasek postępu, jeśli używasz ffmpeg. Wynik działania ffmpeg podczas działania jest następujący:
frame= 3366 fps=465 q=31.0 Lsize= 6474kB time=140.35 bitrate= 377.9kbits/s
Odświeżono ~ dwa razy na sekundę. Możesz przeanalizować tę linię i uzyskać dane potrzebne do wyświetlenia postępu. Po uruchomieniu w wierszu poleceń widzisz tylko jedną linię aktualizowaną przez cały czas, ale to, co robi ffmpeg, to zapisanie wiersza, a następnie \ r. Dlatego nie widać wielu linii. Jednak podczas korzystania z StreamReader.ReadLine() na wyjściu błędu programu, dostajesz jeden wiersz dla każdej aktualizacji.
Przykładowy kod do odczytu wyników poniżej. Trzeba by zignorować dowolną linię, która nie zaczyna się od „ramy”, może użyć BeginErrorReadLine() + ErrorDataReceived jeśli chcesz czytać wiersze być asynchroniczny, itd., ale masz pomysł (mam faktycznie przetestowane):
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();
}
}
Ktoś? No dalej, ktoś musiał użyć ffmpeg z .net –