38

私は次のようにffmpegを実行します:

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo(ffmpegPath, myParams);
p.Start();
p.WaitForExit();

...しかし問題は、ffmpegを備えたコンソールがポップアップしてすぐに消えてしまうため、フィードバックを得ることができないことです。プロセスが正しく実行されたかどうかさえわかりません。

では、どうすればよいでしょうか。

  • コンソールに開いたままにするように指示します

  • コンソールに表示されたものをC#で取得します

4

4 に答える 4

56

あなたがする必要があるのは、標準出力ストリームをキャプチャすることです:

p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
// instead of p.WaitForExit(), do
string q = "";
while ( ! p.HasExited ) {
    q += p.StandardOutput.ReadToEnd();
}

また、と同様のことを行う必要がある場合がありますStandardError。その後、でやりたいことができますq

私の質問の1つで発見したように、それは少し厄介です

Jon Skeetが指摘しているように、このような文字列連結を使用することは、パフォーマンスの面で賢明ではありません。代わりに:を使用する必要がありStringBuilderます

p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
// instead of p.WaitForExit(), do
StringBuilder q = new StringBuilder();
while ( ! p.HasExited ) {
    q.Append(p.StandardOutput.ReadToEnd());
}
string r = q.ToString();
于 2009-09-07T18:50:05.200 に答える
22

ルーカスの答えには競合状態があります。出力が残っていても、プロセスがwhileループを離れる(または入力されない)場合、データを見逃す可能性があります。これを防ぐには、プロセスの終了ReadToEndに別の手順を実行する必要があります。

WaitForExit(私の答えの古いバージョンと比較して、フラグが真になると必要性がわからなくなったことに注意してくださいprocess.HasExited。したがって、これは要約すると次のようになります:)

using (var process = Process.Start(startInfo))
{
    var standardOutput = new StringBuilder();

    // read chunk-wise while process is running.
    while (!process.HasExited)
    {
        standardOutput.Append(process.StandardOutput.ReadToEnd());
    }

    // make sure not to miss out on any remaindings.
    standardOutput.Append(process.StandardOutput.ReadToEnd());

    // ...
}
于 2013-09-04T14:19:22.880 に答える
4

この質問は古いことは知っていますが、とにかく追加します。

コマンドラインプロセスの出力を表示するだけで、コンソールウィンドウからプロセスを生成する場合は、標準入力をリダイレクトするだけで済みます(はい、間違っているように聞こえますが、機能します)。

それで:

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo(ffmpegPath, myParams);
p.UseShellExecute = false;
p.RedirectStandardInput = true;
p.Start();
p.WaitForExit();

うまくいくだろう。

于 2010-07-23T00:38:01.347 に答える
4

ffmpegに直接関連するより具体的な回答については、「-report」コマンドをffmpegに渡すと、プロセスの表示で言われたことを含むログが現在のディレクトリにダンプされます。

'-報告する'

完全なコマンドラインとコンソール出力を、現在のディレクトリのprogram-YYYYMMDD-HHMMSS.logという名前のファイルにダンプします。このファイルはバグレポートに役立ちます。また、-loglevelverboseを意味します。

注:環境変数FFREPORTを任意の値に設定しても、同じ効果があります。

FFMpegドキュメントから。

于 2012-05-07T19:23:51.137 に答える