C # Процесс перенаправить вывод класса в видео файл - PullRequest
1 голос
/ 16 апреля 2009

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

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

Ответы [ 3 ]

2 голосов
/ 15 мая 2009

Ниже приведен пример того, как я делаю аналогичную вещь в своем собственном коде, для получения правильного вывода необходимо скопировать поток в виде байтов:

 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 голосов
/ 14 мая 2014

У меня был тот же вопрос и я нашел ответ (в руководстве), поэтому подумал, что поделюсь.

Вам необходимо добавить -v к вашим аргументам, чтобы выводить данные в стандартный вывод, который вы можете прочитать в своей программе.

Извлечение одного потока

Чтобы записать только аудиопоток из сеанса, используйте «-a» опция командной строки. (Аналогично, для записи только видеопотока используйте опция "-v".) В этом случае выводится аудио (или видео) поток будет записан в 'stdout', а не в файл (если только "-P" вариант (см. ниже).

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

0 голосов
/ 16 апреля 2009

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

Класс процесса имеет поток StandardOutput, к которому вы можете обращаться, и вы должны иметь возможность вывести его в файл.

Другой вариант - написать временный пакетный файл и запустить его, используя вместо этого Process.Start ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...