【问题标题】:php ffmpeg exec & shell_exec process stops after few secondsphp ffmpeg exec & shell_exec 进程在几秒钟后停止
【发布时间】:2020-01-30 04:05:58
【问题描述】:

我正在使用带有简单 html 界面的 PHP 脚本文件来控制 FFMPEG 进程从浏览器启动和停止,脚本目标是在我的服务器上开始实时流式传输,通常运行数小时不间断(使用 ffmpeg 和 nginx-rtmp) 我的脚本运行良好,直到我最近注意到这是奇怪的行为 这是我的 php 脚本变量

$cast =" /usr/sbin/ffmpeg -loglevel 0 -thread_queue_size 32768 -re -i '".$src."' -i /var/www/example/logo.png -r 23.976 -strict -2 480x360 -aspect 16:9 -filter_complex 'overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)-23' -vcodec libx264 -x264opts colormatrix=bt709 -profile:v high444 4 -b:v 290k -maxrate 290k -bufsize 250k  -af "aresample=async=1:min_hard_comp=0.100000:first_pts=0" -acodec libfdk_aac -profile:a aac_he_v2 -b:a 16k -map_metadata -1 -f flv  rtmp://localhost/hls/live 2>/dev/null >/dev/null  & " ; 
$output =  shell_exec( $cast   )    ;

就像 FFMPEG 进程一直持续到原始 php 进程(调用它)死掉,起初我认为这个问题与 sorce 或 ffmpeg 命令有关,但我在 sale 上测试了相同的命令,它运行良好。 我的怀疑是 STDIO 等没有正确重定向。即使我从 shell 执行相同的 php 脚本,它也会在几秒钟后停止。

=编辑=

即使我尝试从命令行运行ffmpeg 并使其在后台运行,我得到相同的行为进程在几秒钟后停止,ffmpeg 只有在我等待它输出时才会继续运行。

这是我的操作系统详细信息:-

DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"

【问题讨论】:

  • 您正在将命令发送到后台,因此它会立即返回。您不会从中获得输出。你也应该使用escapeshellarg()php.net/escapeshellarg
  • 尝试添加“nohup”:“nohup /usr/sbin/ffmpeg ....”。
  • 同样的事情ffmpeg 存在时间很短,我认为问题出在ffmpeg 程序而不是 PHP 上。
  • 我找不到参考,但我似乎记得当触发它的 apache 请求结束时,任何产生的后台进程都会死掉。您可以为该 shell_exec 命令使用 NOHUP 前缀来防止这种情况发生。

标签: php shell ffmpeg exec


【解决方案1】:

好吧好吧,经过几天的尝试和调查,问题看起来主要问题出在ffpmeg 上,原因是我拒绝在没有定义任何输出管道的情况下运行,我的猜测是输入 stram 有时会掉一些帧到时间 。无论如何,这是我添加到 ffmpeg 命令末尾的内容

$cast ="< /dev/null /usr/sbin/ffmpeg -loglevel verbose -thread_queue_size 12768 -re -i \"$link/$chnl\" -r 23.976 -s 480x360  -vcodec libx264 -b:v $bitrate -minrate $bitrate -maxrate $bitrate -bufsize $bitrate -acodec aac -b:a 29k -map_metadata -1 -f flv rtmp://localhost/hls/live  </dev/null >/dev/null 2>/var/www/vlc10/ffmpeg.log & " ;
exec(   $cast   ) ; 

我不得不将ffmpeg 重定向到这样的日志文件&lt;/dev/null &gt;/dev/null 2&gt;/var/www/vlc10/ffmpeg.log &amp; eve ffmpeg 具有静音模式,但它无法工作“或至少在几秒钟后崩溃”。

【讨论】:

  • 您是否尝试过类似的操作,但没有将进程发送到系统级别的后台? php.net/manual/en/function.popen.php#92413
  • -我的代码“将命令输出重定向到文件”-execshell_exec 都可以完美运行。我还没试过popen/pclose
【解决方案2】:

CLI 上的 PHP 和作为 FPM 或 Apache 模块的 PHP 具有不同的配置 (php.ini)

因此,在您的情况下,您需要为正确的环境修改max_execution_time。 可以在对应的php.ini中设置或者用ini_set()或者用set_time_limit()来设置

编辑: 也许你想切换到exec() 但请记住:

如果使用此功能启动程序, 为了让它继续在后台运行,输出 程序必须重定向到一个文件或另一个输出流。 否则将导致 PHP 挂起,直到执行 程序结束。

请使用escapeshellarg()

【讨论】:

  • 实际上 exec 不应该在 max_excution_time 设置上中继,因为它应该在后台运行,而您忘记了如果将执行时间设置为 max ,浏览器将等待@ 987654326@进程停止运行。
  • 如果您阅读文档,我认为它确实会中继它:php.net/manual/en/function.shell-exec.php“通过 shell 执行命令并将完整的输出作为字符串返回”所以它会一直运行,直到进程给你一个结果返回值。
  • 请重新阅读您链接到的文档和问题 - 特别是这一点:2&gt;/dev/null &gt;/dev/null &amp;。使用像这样的脚本&lt;?php shell_exec("sleep 30 2&gt;/dev/null &gt;/dev/null &amp;"); 验证这一点很简单
猜你喜欢
  • 2018-10-22
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2014-05-18
  • 2019-09-13
相关资源
最近更新 更多