Alternative method to capture PHP exec() output from cmd line program (rtmpdump.exe)

cmd, php, rtmp

Solution

Thanks to JohnF getting me on the right track, should any other novices need to accomplish this, here's how I did it using proc_open:

$descriptorspec = array(
0 => array("pipe", "r"),    // stdin is a pipe that the child will read from
1 => array("pipe", "w"),    // stdout is a pipe that the child will write to
2 => array("pipe", "w")     // stderr is a pipe that the child will write to
);
$cmd = c:\rtmpdump\rtmpdump -r "rtmp://fms.domain.com/live/live_800 -B 1 -m 3";
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
    $stdin = stream_get_contents($pipes[0]);
    $stdout = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[0]);  fclose($pipes[1]);  fclose($pipes[2]);
    // It is important that you close any pipes before calling proc_close in order to avoid a deadlock
    $return_value = proc_close($process);   
}

Problem

I've used the exec() function a few times in the past to capture information from command line executables, and had intended to do this again with RTMPDump.exe. The PHP code is as follows, and works with any other cmd line examples I've used in the past, but in this case yields nothing to $output: ``` $cmd = 'c:\rtmpdump\rtmpdump -r "rtmp://fms.domain.com/live/live_800"'; exec($cmd, $output); foreach ($output as $item){ // do something with this $item } ``` I've tried it by putting the Windows command line in a .bat file, and running that, in which ase $output then contains only what was echoed in the bat file, but not the output shown below, which is what results when I run the command manually from the command line. ``` C:\rtmpdump>rtmpdump -r "rtmp://fms.domain.com/live/live_800" RTMPDump v2.3 (c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL Connecting ... INFO: Connected... ERROR: rtmp server sent error Starting Live Stream For duration: 2.000 sec INFO: Metadata: INFO: author INFO: copyright INFO: description INFO: keywords INFO: rating INFO: title INFO: presetname Custom INFO: creationdate Tue May 08 03:00:23 2012 INFO: videodevice Osprey-440 Video Device 1B INFO: framerate 25.00 INFO: width 480.00 INFO: height 360.00 INFO: videocodecid avc1 INFO: videodatarate 800.00 INFO: avclevel 30.00 INFO: avcprofile 66.00 INFO: videokeyframe_frequency10.00 INFO: audiodevice Osprey-440 Audio Device 1B INFO: audiosamplerate 22050.00 INFO: audiochannels 1.00 INFO: audioinputvolume 75.00 INFO: audiocodecid mp4a INFO: audiodatarate 48.00 ####### Download complete C:\rtmpdump>rtmpdump ``` The program DOES run, that's not the problem, there is an output file that shows the video data dump, so syntax of the executable is not the issue - the question is whether there is any other way to intercept what rtmpdump.exe is outputting to the command window, that is NOT being captured by running it from PHP via exec(). And if it matters, it's the "INFO:... " that I'm interested in using. I'm trying to determine if a live video stream is streaming or not. The server is running, but I need to know if a particular stream (live_800) is streaming or not.

Original source