2009-04-16 9 views
1

Processクラスを使用してopenRTSPを実行する小さなGUIラッパーを作成しました。私が抱えている問題は、出力をmpeg4ビデオファイルにリダイレクトすることです。コマンドラインでopenRTSPを実行することによって、私が渡しているパラメータが正しいことを確認しました。C#プロセスクラスはビデオファイルに出力をリダイレクト

openRTSP.exe - 一部-parameters -for - ビデオ-4 RTSP://video.from.server> video.mp4

"> video.mp4" 私は悩みの再生を持っていますものです。

Processクラスを使用する他の例を見てきましたが、ASCIIテキストのみで動作するようです。

編集は--- ここではいくつかの詳細です

this.outputStream = new StreamWriter(fileNameToUse, false, Encoding.Default); 

try 
{ 
    byte[] buffer; 

    // Start the process with the info we specified. 
    // Call WaitForExit and then the using statement will close. 
    using (Process exeProcess = new Process()) 
    { 
     // Assign start info to the process 
     exeProcess.StartInfo = startInfo; 

     // Set up the event handler to call back with each line of output 
     exeProcess.OutputDataReceived += new DataReceivedEventHandler(OnDataReceived); 

     // Start the Process 
     exeProcess.Start(); 

     exeProcess.BeginOutputReadLine(); 
     exeProcess.WaitForExit(); 
    } 
} 
catch (Exception ex) { PrintException(ex); } 
finally 
{ 
    this.outputStream.Flush(); 
    this.outputStream.Close(); 
} 

// Called asynchronously with a line of data 
private void OnDataReceived(object Sender, DataReceivedEventArgs e) 
{ 
    lock (this) 
    { 
     if (!string.IsNullOrEmpty(e.Data) && (this.outputStream != null)) 
      this.outputStream.WriteLine(e.Data); 
    } 
} 

データを書き込むWriteLineメソッドを使用して、受信した、私のアプリケーションは、ファイルサイズが、私はコマンドラインからopenRTSPを実行する場合と同じです終了したときにどの「正しい」出力、すなわち再生可能なmpeg4ビデオを生成する。コマンドラインから実行すると、openRTSPはmpeg4ファイルを出力しています。私はmpeg4にリダイレクトしています。

startInfo.Argumentsに割り当てられた文字列の最後に "> fileNameToUse"を追加しようとしましたが、すぐにopenRTSPが失敗しました。

おかげで、 マット

+0

[MedallionShell](https://github.com/madelson/MedallionShell)ライブラリが興味深いかもしれません。これにより、プロセスストリームのリダイレクトが非常に簡単になります。 – ChaseMedallion

答えて

0

あなたは代わりに、コマンドライン上>のparamaterを渡すのでは、標準出力をキャプチャし、それをファイルに記述する必要があります。

プロセスクラスには、アクセスできるStandardOutputストリームがあり、ファイルにダンプできなければなりません。

別の方法として、一時バッチファイルを作成し、代わりにProcess.Start()を使用して起動することができます。

2

次は自分のコードで同じようなことをやって、私の一例であり、それは有効な出力を得るためにバイトとしてストリームをコピーする必要があります:

明らか
public void Example() { 
     //Prepare the Process 
     ProcessStartInfo start = new ProcessStartInfo(); 
     if (!_graphvizdir.Equals(String.Empty)) { 
      start.FileName = this._graphvizdir + "dot.exe"; 
     } else { 
      start.FileName = "dot.exe"; 
     } 
     start.Arguments = "-T" + this._format; 
     start.UseShellExecute = false; 
     start.RedirectStandardInput = true; 
     start.RedirectStandardOutput = true; 

     //Prepare the GraphVizWriter and Streams 
     GraphVizWriter gvzwriter = new GraphVizWriter(); 
     BinaryWriter output = new BinaryWriter(new FileStream(filename, FileMode.Create)); 

     //Start the Process 
     Process gvz = new Process(); 
     gvz.StartInfo = start; 
     gvz.Start(); 

     //Write to the Standard Input 
     gvzwriter.Save(g, gvz.StandardInput); 

     //Read the Standard Output 
     StreamCopy(gvz.StandardOutput.BaseStream, output.BaseStream); 
     output.Close(); 

     gvz.Close(); 
    } 

    public void StreamCopy(Stream input, Stream output) { 
     int i; 
     byte b; 

     i = input.ReadByte(); 

     while (i != -1) 
     { 
      b = (byte)i; 
      output.WriteByte(b); 

      i = input.ReadByte(); 
     } 
    } 

あなたはへの書き込みを残すことができます標準入力ビットは必要ありません。主なものは、RedirectStandardOutputを設定し、出力をBinaryWriterにコピーして、目的の出力ファイル用にFileStreamに書き込むことです。

0

私は同じ質問をして答えを見つけました(マニュアル内)ので、私は分かち合うと思っていました。

引数に-vを追加する必要があります。引数を指定すると、標準出力にデータが出力され、プログラムで読むことができます。

はセッションからのみオーディオストリームを記録するために単一のストリームを抽出し、「-a」 コマンドラインオプションを使用します。この場合、出力オーディオ(またはビデオ)ストリーム は、ファイルではなく「stdout」に書き込まれます(ただし、ビデオストリームのみを記録する場合は、 -P "オプション(下記参照)が指定されています)。

また、これはバイナリデータなので、Process.OutputStreamのBaseStreamを取得し、それを処理します。

関連する問題