Возвращение FFMPEG в фоновом режиме

Я делаю код, который загружает список m3u8 ссылки по FFMPEG

У меня был этот код:

function FFMPEG($videocode, $dirvideo) {

    $ffmpeg = '"D:\FFMPEG\bin\ffmpeg.exe"' . " -hide_banner -loglevel verbose -n -i https://linkplaylist/{$videocode}.m3u8 -map 0:1 -map 0:2 -acodec copy -bsf:a aac_adtstoasc -vcodec copy {$dirvideo} 1> log.txt  2>&1";

    exec($ffmpeg, $output, $var);

    return $var;
}

$code = FFMPEG('football', 'football.mp4');

if($code){
    {ERROR CODE}; 
    }else{

    {SUCCESS CODE}
}   

Начальная проблема

И это сработало хорошо. Я мог бы загрузить видео и узнать, было ли оно загружено полностью или было какая-то ошибка.

Проблема заключается в том, что этот код "вешает" скрипт в exec (), загружаемый страницей, до завершения exec () и сценария ошибки тайм-аута (общий сервер), кроме того, что визуально странная для посетителя загрузка страницы.

Разрешение исходной проблемы

После исследования я думаю, что решение состоит в том, чтобы поместить выполнение кода в фоновом режиме, чтобы я нашел этот код:

$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("file", "error-output.txt", "a") // stderr is a file to write to
);

function FFMPEG($videocode, $dirvideo) {
$cmd = 'start /B D:\FFMPEG\bin\ffmpeg.exe  -y -i "https://linkplaylist/{$videocode}.m3u8" -map p:0 -acodec copy -bsf:a aac_adtstoasc -vcodec copy {$dirvideo}';
proc_close(proc_open ($cmd
,$descriptorspec, $foo));
}

И наконец моя текущая проблема

И это прекрасно работает для проблемы загрузки и тайм-аута, но я не могу получить возврат после успешного завершения загрузки.

1 ° proc_open Это лучшее решение для моей первоначальной проблемы?

2 ° Как я могу получить возврат после успешного завершения ffmpeg и продолжения работы сценария.

Дополнительная информация

Я пытаюсь создать решение, которое работает на Windows (XAMPP), но мой последний сервер Linux.

1 ответ

У меня та же проблема, и, надеюсь, кто-то может завершить мой вклад.

Это только частичный ответ, который я не знаю, как заполнить для Windows. Уловка, по-видимому, в каналах, согласно вики ffmpeg, но решение для Unix:

Еще одна вещь, о которой нужно позаботиться, это стандартный INPUT (stdin). Средство командной строки ffmpeg разработано как интерактивная утилита, которая принимает вводимые пользователем данные (обычно с клавиатуры) и сообщает журнал ошибок на текущем экране / терминале пользователя. Когда мы запускаем ffmpeg в фоновом режиме, мы хотим сказать ffmpeg, что входные данные от stdin не принимаются (и не ожидаются). Мы можем сказать это ffmpeg, снова используя перенаправление ввода / вывода "

Я пытался использовать -nostdin, но это не имело никакого эффекта.

Другие вопросы по тегам