Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I am having issues piping the output from the rtmpdump process to ffmpeg and I believe the issue is my process is stealing the output of rtmpdump.

In my research I have heard of trying to use a cmd.exe process and run rtmpdump.exe as a /C command within that, but this issue is I lose reference to the rtmpdump.exe process that is spawned from that, and I need to be able to manage multiple rtmpdump processes within my program and selectively kill certain ones at times.

I initially tried something simple like this:

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"";

This does not work at all.

with "cmd.exe" as initial process:

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"";

This gets me closer to what I need it starts a rtmpdump process and redirects to ffmpeg, but now "p" will reference a non existent "cmd.exe" process that ran the command to start rtmpdump then "cmd.exe" terminates.

My only concern is being able to keep reference of the rtmpdump.exe processes created. ffmpeg will self terminate after rtmpdump closes its process can be ignored.

Edit: If the question wasn't clear. I am trying to pipe the output of rtmpdump to ffmpeg. normal way of doing it as part of the command argument are not working using the redirection operator |. and using a "cmd.exe" process does not work as needed.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
278 views
Welcome To Ask or Share your Answers For Others

1 Answer

Came up with a simple solution.

Using the the CMD process as your starting process.

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

And using this bit of code right after starting the process to get the last created rtmpdump process.

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...