我遇到了问题,将输出从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“过程并不能按需要工作。
发布于 2014-05-22 08:36:03
想出了一个简单的解决方案。
使用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.
}发布于 2014-05-22 01:18:23
我学到的东西和我在这里回答的一样多。
似乎没有一种简单的方法可以管理同名的多个进程(int --这里是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 ...选项,以最小化窗口。
https://stackoverflow.com/questions/23795044
复制相似问题