我遇到了将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”进程不能按需工作。
答案 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 ...
选项,以最大限度地减少窗口。