2009-09-03 14 views
3

Das ist eigentlich mit einer anderen Frage verbunden, die ich hatte, die bereits beantwortet wurde. Diese Frage ist hier: Redirecting stdout of one process object to stdin of anotherUmleitung stdin und stdout, wo Stdin zuerst schließt

Mein Problem ist (denke ich), dass das Programm, das die Eingabe erhält, vor der Ausgabe des Programms beendet werden sollte. Hier ist das Bash-Äquivalent von dem, was ich mache: tccat -i/dev/sr0 -T 1 | ffmpeg -i - -r 1 -t 1 -s 96x72 -ss 5 /tmp/wsmanage/preview_tmp/test\%03d.jpg

Dies verwendet nur ein Programm namens tccat, um den ersten Titel einer DVD zu lesen. Das wird in ffmpeg ausgegeben, was eine Ausgabedatei mit 1 Bild pro Sekunde erzeugt, die 1 Sekunde lang im JPG-Format ist. Sobald es seinen Rahmen (oder zwei) ausgibt, existiert es. Das funktioniert gut.

Der folgende Code jedoch nicht. Ich bekomme eine Menge von "Druckzeile zu ffmpeg", während die Befehlszeilenversion in etwas mehr als einer Sekunde beendet wird. Dann hört es nach 30 oder 40 Sekunden oder so einfach auf zu drucken. FFmpeg wird nie beendet, und mein Programm wird nie fortgesetzt.

Ich mache ich das richtig?

Antwort

0

Gibt tccat keine binären Daten aus, da Sie mit Video und Bildern arbeiten? Wenn ja, sollten Sie nicht direkt in die Eingabe-/Ausgabestreams schreiben/schreiben, anstatt sie in einen Textleser zu schreiben?

Wenn ja Sie werden möchten, mit Can i put binary in stdin? C#

+0

Ah, das ist mein Problem sein kann. Ich wusste nicht, dass Streamreader/Streamwriter nicht binär sicher sind. Ich werde es versuchen, sobald ich kann und poste zurück mit den Ergebnissen! Danke für den Link auch. Ich sehe genau, was ich tun muss. Auch wenn das nicht mein einziges Problem ist, kann ich sehen, dass es definitiv etwas ist, das repariert werden muss. – Matthew

+0

Das war es! Vielen Dank! – Matthew

0

Für jeden, der etwas Ähnliches zu tun, hier ist die neue Version mit KeeperOfTheSoul Rat angewandt:

 Process tccatProcess = new Process();   
     tccatProcess.StartInfo.FileName = "tccat"; 
     tccatProcess.StartInfo.Arguments = String.Format("-i {0} -T {1}", devNode, title); 
     tccatProcess.StartInfo.UseShellExecute = false; 
     tccatProcess.StartInfo.RedirectStandardOutput = true; 

     Process ffmpegProcess = new Process(); 
     string bashSafePreviewTemplate = slasher.bashSlash(previewTempDir + "/test%03d.jpg"); 
     ffmpegProcess.StartInfo.FileName = "ffmpeg"; 
     ffmpegProcess.StartInfo.Arguments = String.Format("-i - -r 1 -t 1 -s {1}x{2} -ss {3} {0}", 
      bashSafePreviewTemplate, width, height, timePosition); 
     ffmpegProcess.StartInfo.UseShellExecute = false; 
     ffmpegProcess.StartInfo.RedirectStandardInput = true; 

     Console.WriteLine("tccat command: {0} {1}", tccatProcess.StartInfo.FileName, tccatProcess.StartInfo.Arguments); 
     Console.WriteLine("ffmpeg command: {0} {1}", ffmpegProcess.StartInfo.FileName, ffmpegProcess.StartInfo.Arguments); 

     //return true; 

     try{ 
      tccatProcess.Start(); 
      ffmpegProcess.Start(); 

      BinaryReader tccatOutput = new BinaryReader(tccatProcess.StandardOutput.BaseStream); 
      BinaryWriter ffmpegInput = new BinaryWriter(ffmpegProcess.StandardInput.BaseStream); 
      int buffSize = 4096; 
      byte[] buff = new byte[buffSize]; 


      while(!ffmpegProcess.HasExited) 
      { 
       ffmpegProcess.Refresh(); 
       buff = tccatOutput.ReadBytes(buffSize); 
       ffmpegInput.Write(buff); 
       ffmpegInput.Flush(); 
      } 


      tccatProcess.Kill(); 
      tccatProcess.Close(); 
      ffmpegProcess.Close(); 


     }catch(Exception e){ 
        //uninteresting log code 
        return false; 

     }