2009-04-16 2 views
1

Я написал небольшую оболочку GUI, которая будет выполнять openRTSP с использованием класса Process. Проблема, с которой я сталкиваюсь, перенаправляет вывод в файл видео mpeg4. Я проверил параметры, которые я передаю, правильно, запустив openRTSP в командной строке.C# Переадресация процесса класса в видеофайл

openRTSP.exe -Некоторого -дль вИдео-параметры -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.

Я попытался добавить «> fileNameToUse» в конец строки, назначенной startInfo.Arguments, но это немедленно сработало openRTSP.

Спасибо, Matt

+0

Возможно, вам понравилась библиотека [MedallionShell] (https://github.com/madelson/MedallionShell). Это делает перенаправление технологических потоков очень простыми для работы. – ChaseMedallion

ответ

0

Вы, возможно, придется захватить стандартный вывод и записать его в файл, вместо передачи> В параметре командной строке.

Класс процесса имеет поток 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» вариант командной строки. (Аналогично, для записи только видеопотока используйте вариант «-v».) В этом случае выходной аудио (или видео) поток будет записан в «stdout», а не в файл (если только « -P "(см. Ниже)).

Также это будут двоичные данные, поэтому получите BaseStream Process.OutputStream и поработайте с этим.

Смежные вопросы