1

この質問を参照すると、ご覧のとおり、プログラムを実行してデータを受け取ることができました。

ただし、たとえば、ファイルの変換中にデータを送信することができず、qすぐに変換を停止してプログラムを停止しました。
プロセスの停止もアプリケーションでサポートする必要があります。これは、このパラメーターを ffmpeg アプリに渡すことで行う必要があると思います。収集されていないすべてのリソースや、単に行って使うprocess.Kill()

これが私が試したことです:

static int lineCount = 0;
static bool flag;
static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
  Console.WriteLine("Error ({1:m:s:fff}: {0})", lineCount++,
      DateTime.Now);

  if (e.Data != null && string.Equals(e.Data,"Press [q] to stop, [?] for help")) 
    flag = true;

  if (flag)
  {
    flag = false;
    Console.WriteLine("Stopping ({0:m:s:fff})...", DateTime.Now);
    process.CancelErrorRead();
    process.CancelOutputRead();
    process.StandardInput.WriteLine("q");
  }   

  Console.WriteLine(e.Data);
  Console.WriteLine();
}

しかし、それは何もしません。変換が要求されると、それを制御できなくなり、出力を受け取ることしかできないようです。スタンドアロンとして実行すると、もちろん対話が可能になります。

ここで何が欠けていますか、出力を送信する際の別のトリックですか、前の回答のコードが間違っていますか、それとも別のアプローチを選択する必要がありましたか?

あなたの注意のために、RedirectStandardInputオンです。

注: 前の質問の回答でわかるように、ffmpeg の相互作用は異なります。答えを知っているのは (おそらく私が間違っているかもしれません) ffmpeg の経験がある人だと思います。

4

2 に答える 2

2

WriteLine('q');の代わりに使用してくださいWrite('q');

:)

cygwin bashシェルからffmpegを実行しようとしましたが、後にEnterを入力する必要があることがわかりました'q'。それで....

    static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        Console.WriteLine("Error line: {0} ({1:m:s:fff})", lineCount++,
            DateTime.Now);
        Console.WriteLine(e.Data);
        Console.WriteLine();
        if (lineCount == 5)
            process.StandardInput.WriteLine("q");
    }

在庫ありc:\Documents and Settings\All Users\Documents\My Music\Sample Music\Beethoven's Symphony No. 9 (Scherzo).wma

  • それがないと、process.StandardInput.WriteLinestderrに61行、stdoutに1行が出力され、1212457バイトのmp3ファイルが作成されます。
  • quitを追加すると、stderrに出力される行数が少なくなり、stdoutには何も出力されず、mp3ファイルははるかに小さくなります。

mp3ファイルが残っていることに注意してください。

だからそこに。

編集

あなたがすでにこれを試したというあなたのコメントを見た後。

再確認しました。振る舞いはおかしい。

最初に私が持っていたものを再試行"q\n"し、5行目をsterrに送信すると、実行ごとにサイズがわずかに異なりますが、160Kから220Kの間で、はるかに小さいファイルが作成されることがわかりました。

Console.WriteLine次に、ffmpegがより速く終了することを期待してコメントしました。それどころか、ffmpegはまったく停止せず、まったく同じバイト数である1,212,457バイトの完全なファイルを作成しました。この振る舞いはあなたの観察と一致しています

最後に、所定の位置にある状態で、私はすべてのラインを5番目以降WriteLinesにポンプで送りました。ビッグサプライズ!40行のエラー行をログに記録した後、"q\n"stderr

Unhandled Exception: System.InvalidOperationException: StandardIn has not been redirected.
   at System.Diagnostics.Process.get_StandardInput()
   at StandAlone.Program.process_ErrorDataReceived(Object sender, DataReceivedEventArgs e) in C:\[..]\StandAlone\Program.cs:line 171
   at System.Diagnostics.Process.ErrorReadNotifyUser(String data)

リダイレクトされませんか?そして、私がその入力に35行を送信した後、あなたは私に言っていますか?

何かが正しくありません...バグのようなにおいがします。

質問者による更新:

ここからWindowsビルドを更新すると(静的)問題が解決しました。非公式のWebサイトからのビルドを使用したようです。

于 2011-09-30T09:03:16.677 に答える
1

成功しました。コード内のプロセスのようにグローバル変数を使用しています:

private void RunProcessAsync(string FfmpegPath, string Parameters)
{
  //Create process info
  ProcessStartInfo oInfo = new ProcessStartInfo(FfmpegPath, Parameters);
  //Set process properties
  oInfo.UseShellExecute = false;
  oInfo.CreateNoWindow = true;
  oInfo.RedirectStandardOutput = false;
  oInfo.RedirectStandardError = true;
  oInfo.RedirectStandardInput = true;

  process.StartInfo = oInfo;

  process.EnableRaisingEvents = true;
  process.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived);
  process.Exited += new EventHandler(proc_Exited);

  process.Start();
  // this.pid = proc.Id;          
  process.BeginErrorReadLine();
}

public void stopProcess()
{
  process.StandardInput.WriteLine("q");
}
于 2015-05-07T06:00:26.860 に答える