php ffmpeg exec & shell_exec процесс останавливается через несколько секунд - PullRequest
4 голосов
/ 30 сентября 2019

Я использую файл сценария PHP с простым html-интерфейсом для управления запуском и остановкой процесса 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, но я проверяю ту же команду на продажу, и она отлично работает. Мои подозрения с STDIO и т. Д. Не были перенаправлены правильно. даже когда я выполняю тот же php-скрипт из оболочки, он делает те же самые остановки через несколько секунд.

= Edit =

Даже когда я пытался запустить ffmpeg из командной строки и сделатьон работает в фоновом режиме, у меня такое же поведение, что процесс останавливается через несколько секунд, ffmpeg продолжает работать, только если я жду его вывода.

Вот мои данные ОС: -

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

Ответы [ 2 ]

3 голосов
/ 06 октября 2019

Хорошо, хорошо, после нескольких дней попыток и расследования, проблема выглядит так, как будто основная проблема была с ffpmeg, потому что я не знаю, почему я отказываюсь работать без определения какого-либо канала вывода, я предполагаю, что входной поток пропустил некоторые кадры от времени довремяв любом случае это то, что я добавляю в конец команды 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, чтобы такой файл журнала </dev/null >/dev/null 2>/var/www/vlc10/ffmpeg.log & eve ffmpeg имел тихий режим, но он не будет работать "или применьше всего разбился через несколько секунд ".

0 голосов
/ 30 сентября 2019

PHP на CLI и PHP как FPM или модуль Apache имеют разные конфигурации (php.ini)

Так что в вашем случае вам нужно изменить max_execution_time для правильной среды. Вы можете установить его в соответствующем php.ini или с помощью ini_set () или с помощью set_time_limit ()

РЕДАКТИРОВАТЬ: Может быть, вы хотите переключиться на exec () Но имейте в виду:

Если программа запускается с этой функцией, чтобы она продолжала работать в фоновом режиме, выходные данные программы должны быть перенаправлены в файл или другой поток вывода. Невыполнение этого требования приведет к зависанию PHP до завершения выполнения программы.

И, пожалуйста, используйте escapeshellarg ()

...