C#Process class将输出重定向到视频文件

时间:2009-04-16 01:55:16

标签: c# .net process

我写了一个小的GUI包装器,它将使用Process类执行openRTSP。我遇到的问题是将输出重定向到mpeg4视频文件。我通过在命令行上运行openRTSP来验证我传递的参数是否正确。

openRTSP.exe -some -parameters -for -video -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立即失败。

谢谢, 马特

3 个答案:

答案 0 :(得分:2)

以下是我在自己的代码中执行类似操作的示例,有必要将流复制为Bytes以获得有效输出:

 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以获取所需的输出文件。

答案 1 :(得分:0)

您可能必须捕获标准输出并将其写入文件,而不是传递>命令行上的参数。

Process Class有一个您可以访问的StandardOutput流,您应该能够将其转储到文件中。

另一种选择可能是编写一个临时批处理文件,然后使用Process.Start()来启动它。

答案 2 :(得分:0)

我有同样的问题并找到答案(在手册中),所以我想我会分享。

您需要在参数中添加-v,这会将数据输出到标准输出,您可以在程序中读取。

  

提取单个流

     

要仅录制会话中的音频流,请使用“-a”   命令行选项。 (同样,要仅录制视频流,请使用   “-v”选项。)在这种情况下,输出音频(或视频)流   将写入'stdout',而不是写入文件(除非“-P   “选项(见下文)给出了。”

这也是二进制数据,所以获取Process.OutputStream的BaseStream并使用它。