Возвращение 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
, но это не имело никакого эффекта.