私はいくつかのビデオファイルで動作するようにプログラムを作っています。C#外部プログラムを実行して出力をキャプチャ(ストリーム)
私はffmpeg実行可能ファイルを使用して、複数のファイルを1つのファイルにマージしています。 このコマンドは終了するまでに数分かかるので、出力を「監視」し、GUIにプログレスバーを表示する方法が必要です。次のstackoverflowのトピックを見てみると
:
- How to parse command line output from c#?
- Process.start: how to get the output?
- How To: Execute command line in C#, get STD OUT results
私はこのコードを作った:
Process ffmpeg = new Process
{
StartInfo =
{
FileName = @"d:\tmp\ffmpeg.exe",
Arguments = "-f concat -safe 0 -i __sync.txt -c copy output.mp4",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true,
WorkingDirectory = @"d:\tmp"
}
}
ffmpeg.EnableRaisingEvents = true;
ffmpeg.OutputDataReceived += (s, e) => Debug.WriteLine(e.Data);
ffmpeg.ErrorDataReceived += (s, e) => Debug.WriteLine([email protected]"Error: {e.Data}");
ffmpeg.Start();
ffmpeg.BeginOutputReadLine();
ffmpeg.WaitForExit();
このコードを実行すると、ffmpegがファイルのマージを開始し、Windowsタスクマネージャのffmpegプロセスが表示され、十分に待っているとffmpegはエラーなしでジョブを終了します。しかし、Debug.WriteLine(e.Data)
は呼び出されません(デバッグウィンドウでは出力されません)。 Console.WriteLine
にも変更しようとしました(出力はありません)。 ffmpegのが終了するまでWhile (!ffmpeg.StandardOutput.EndOfStream)
に
Process ffmpeg = new Process
{
StartInfo =
{
FileName = @"d:\tmp\ffmpeg.exe",
Arguments = "-f concat -safe 0 -i __sync.txt -c copy output.mp4",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true,
WorkingDirectory = @"d:\tmp"
}
}
ffmpeg.Start();
while (!ffmpeg.StandardOutput.EndOfStream)
{
var line = ffmpeg.StandardOutput.ReadLine();
System.Diagnostics.Debug.WriteLine(line);
Console.WriteLine(line);
}
ffmpeg.WaitForExit();
ここでも、ffmpegのはエラーなしで開始されていますが、C#、「ハング」:
だから、この後、私はこの別のバージョンを試してみました。Windowsのプロンプトでexactコマンドを実行すると、ffmpegの進行状況とともに多くの出力テキストが表示されます。