Возвращение FFMPEG в фоновом режиме - PullRequest
0 голосов
/ 20 мая 2018

Я делаю код, который загружает список 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 Ответ

0 голосов
/ 07 сентября 2018

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

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

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

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

...