管道输出输出到新过程

我有问题将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进程的引用。 ffmpeg将在rtmpdump关闭后自行终止其进程可以被忽略。

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

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

使用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.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命令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 ...以最小化窗口。