【发布时间】: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前缀来防止这种情况发生。