管道输出输出到新过程

时间:2014-05-21 22:39:43

标签: c# .net process rtmp piping

我遇到了将rtmpdump进程的输出传递给ffmpeg的问题,我相信问题是我的进程正在窃取rtmpdump的输出。

在我的研究中,我听说尝试使用cmd.exe进程并在其中运行rtmpdump.exe作为/ C命令,但是这个问题是我丢失了对从中生成的rtmpdump.exe进程的引用,我需要能够在我的程序中管理多个rtmpdump进程,并有时选择性地杀死某些进程。

我最初尝试过这样简单的事情:

var p = new Process();
p.StartInfo.FileName = "rtmpdump.exe";
p.StartInfo.Arguments = "-v -r rtmp://somehost.com/app-name -o - | ffmpeg.exe -loglevel quiet -i - -c:v copy -c:a libvo_aacenc -b:a 128k \"test.mp4\"";

这根本不起作用。

以“cmd.exe”作为初始流程:

var p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/C rtmpdump.exe -v -r rtmp://somehost.com/app-name -o - | ffmpeg.exe -loglevel quiet -i - -c:v copy -c:a libvo_aacenc -b:a 128k \"test.mp4\"";

这让我更接近我需要它开始一个rtmpdump进程并重定向到ffmpeg,但现在“p”将引用一个不存在的“cmd.exe”进程运行命令启动rtmpdump然后“cmd.exe”终止。

我唯一关心的是能够保持对创建的rtmpdump.exe进程的引用。在rtmpdump关闭后,ffmpeg将自动终止其进程可以被忽略。

编辑: 如果问题不明确。我试图将rtmpdump的输出传递给ffmpeg。作为命令参数的一部分执行它的正常方法是使用重定向运算符|。并使用“cmd.exe”进程不能按需工作。

2 个答案:

答案 0 :(得分:2)

提出了一个简单的解决方案。

使用CMD流程作为启动流程。

var p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/C rtmpdump.exe -v -r rtmp://somehost.com/app-name -o - |       ffmpeg.exe -loglevel quiet -i - -c:v copy -c:a libvo_aacenc -b:a 128k \"test.mp4\"";
test.Start();

在启动进程后立即使用这段代码来获取最后创建的rtmpdump进程。

Process[] allDumps = Process.GetProcessesByName("rtmpdump"); // get all rtmp processes
if (allDumps.Any())
{
    Process newestProcess = allDumps.OrderByDescending(x => x.StartTime).First(); // get the last one created     
    // Add the newly captured process to your list of processes for use later.
}

答案 1 :(得分:0)

我正在学习,就像我在这里回答一样。

似乎没有一种简单的方法来管理具有相同名称的多个进程(在本例中为rtmpdump.exe)。

使用控制台命令START并通过START为其启动不同的窗口标题名称,而不是使用进程名称或PID,似乎有另一种方法。

在命令控制台中,您可以键入以下内容:

C:\>start "dumpProc01" rtmpdump.exe -v -r .......
C:\>start "dumpProc02" rtmpdump.exe -v -r .......
C:\>start "dumpProc03" rtmpdump.exe -v -r .......

使用taskkill命令终止一个特定进程。例如:

C:\>taskkill /fi "windowtitle eq dumpProc01"

要将START应用于流程创建,流程参数将为:

// from this
p.StartInfo.Arguments = "/C rtmpdump.exe ....

// to this
p.StartInfo.Arguments = "/C start \"dumpProc01\" rtmpdump.exe -v -r ....

对于杀死特定进程,您将进行taskkill进程:

Process kp = new Process();
kp.StartInfo.FileName = "taskkill.exe";
kp.StartInfo.Arguments = "/fi \"windowtitle eq dumpProc01\" ";
kp.Start();

您可以为/min等启动命令提供start /min ...选项,以最大限度地减少窗口。