C# 管道工艺输出到新工艺

C# 管道工艺输出到新工艺,c#,.net,process,rtmp,piping,C#,.net,Process,Rtmp,Piping,我在将输出从rtmpdump进程传输到ffmpeg时遇到问题,我认为问题在于我的进程正在窃取rtmpdump的输出 在我的研究中,我听说过尝试使用cmd.exe进程并在其中以a/C命令的形式运行rtmpdump.exe,但这个问题是我失去了对由此产生的rtmpdump.exe进程的引用,我需要能够在程序中管理多个rtmpdump进程,并有时选择性地杀死某些进程 我最初尝试过这样简单的方法: var p = new Process(); p.StartInfo.FileName = "rtmpdu

我在将输出从rtmpdump进程传输到ffmpeg时遇到问题,我认为问题在于我的进程正在窃取rtmpdump的输出

在我的研究中,我听说过尝试使用cmd.exe进程并在其中以a/C命令的形式运行rtmpdump.exe,但这个问题是我失去了对由此产生的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进程的引用。ffmpeg将在rtmpdump关闭后自动终止,其进程可以忽略

编辑:
如果问题不清楚的话。我试图通过管道将rtmpdump的输出传输到ffmpeg。作为命令参数的一部分执行此操作的常规方法无法使用重定向运算符|。而且使用“cmd.exe”进程无法按需要工作

我学到的和我在这里回答的一样多

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

与使用进程名或PID不同,似乎还有另一种方法,即使用控制台命令
START
,并为
START
启动的进程指定不同的窗口标题名

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

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();

您可以为start命令提供
/min
选项,如
start/min…
,以最小化窗口。

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

使用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.
}

问题到底是什么?我正试图通过管道将rtmpdump的输出传输到ffmpeg,但在进程参数中使用|重定向运算符不起作用。@LittleBill902也许你可以尝试将
taskkill/im“rtmpdump.exe”
作为终止进程。我不知道如何获取PID并使用它。一次可以有许多“rtmpdump.exe”进程。这不起作用,因为它不允许您通过管道传输rtmpdump的输出。相反,重定向操作符尝试重定向START命令