首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从命令行程序(rtmpdump.exe)捕获PHP exec()输出的另一种方法

从命令行程序(rtmpdump.exe)捕获PHP exec()输出的另一种方法
EN

Stack Overflow用户
提问于 2012-05-09 09:20:01
回答 2查看 6.3K关注 0票数 2

我过去曾多次使用exec()函数从命令行可执行文件中捕获信息,并打算使用RTMPDump.exe再次执行此操作。PHP代码如下所示,适用于我在过去使用过的任何其他cmd行示例,但在本例中不会对$output产生任何影响:

代码语言:javascript
复制
    $cmd = 'c:\rtmpdump\rtmpdump -r "rtmp://fms.domain.com/live/live_800"';
    exec($cmd, $output);
    foreach ($output as $item){
        // do something with this $item
    }

我尝试过将Windows命令行放在.bat文件中,然后运行它,在这个文件中,ase $output只包含bat文件中回显的内容,而不包含下面显示的输出,这就是我从命令行手动运行命令时的结果。

代码语言:javascript
复制
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

程序可以运行,这不是问题所在,有一个显示视频数据转储的输出文件,所以可执行文件的语法不是问题-问题是是否有任何其他方法来拦截rtmpdump.exe正在输出到命令窗口的内容,而不是通过exec()从PHP运行它。

如果重要的话,那就是"INFO:...“我有兴趣用的东西。我正在尝试确定实时视频流是否正在流传输。服务器正在运行,但我需要知道特定的流(live_800)是否正在流传输。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-12 04:34:58

感谢JohnF让我走上了正确的道路,如果任何其他新手需要实现这一点,下面是我如何使用proc_open完成这项工作的

代码语言:javascript
复制
$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);   
}
票数 7
EN

Stack Overflow用户

发布于 2012-05-09 09:37:05

尝试使用passthru函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10508676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档