Чтение живого вывода из FFMPEG с использованием PHP - PullRequest
0 голосов
/ 29 сентября 2018

Проблема, с которой я сталкиваюсь, заключается в получении вывода оболочки из команды ffmpeg во время ее выполнения и записи ее на html-страницу с использованием php.

После некоторого исследования я нашел очень похожий запрос: Обновление содержимого страницы из живого вывода PHP и Python с использованием Ajax , которое казалось идеальным, но оно не работает вообще.

Основная идея состоит в том, чтобы использовать AJAX-запрос для вызова сценария PHP, который должен выполнить команду и отобразить содержимое чтения в реальном времени из процесса, стараясь использовать this.readyState == 3 (в противном случае сценарий JS получит ответ только после завершения)

В разделе PHP я попытался использовать код из ответа выше (очевидно, адаптированный к моим потребностям):

<code>function liveExecuteCommand($command){

    while (@ ob_end_flush()); // end all output buffers if any

    $proc = popen($command, 'r');

    $live_output     = "";
    $complete_output = "";

    while (!feof($proc))
    {
        $live_output     = fread($proc, 4096);
        $complete_output = $complete_output . $live_output;
        echo "<pre>$live_output
"; @ flush ();} pclose ($ proc);}

А для секции AJAX я использовал

function getLiveStream(){


        var ajax = new XMLHttpRequest();
          ajax.onreadystatechange = function() {
            if (this.readyState == 3) {

              document.getElementById("result").innerHTML = this.responseText;
            }               
        };          
        var url = 'process/getlive';
        ajax.open('GET', url,true);
        ajax.send();
   }

, что, к сожалению, не работает.

Выполняемая команда такова: 'ffmpeg.exe -i "C:/Users/BACKUP/Desktop/xampp/htdocs/testarea/test.mp4" -map 0:0 -map 0:1 -c:v libx264 -preset fast -crf 26 -c:a libmp3lame -ar 24000 -q:a 5 "C:\Users\BACKUP\Desktop\xampp\htdocs\testarea\output/test.mkv"', которую я протестировал и она работает.

Когда я запускаю html-страницу и скрипт ajax внутри, команда ffmpeg даже не запускается, как я проверилв диспетчере задач. Он просто возвращает пустой текст.

Когда я сам запускаю скрипт php, команда запускается, файл преобразуется, но он ничего не отображает вообще.

После еще одного исследования я также нашел эту страницу, которая, кажется, сделана дляэто точное назначение: https://github.com/4poc/php-live-transcode/blob/master/stream.php

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

Теперь я собираюсь записать вывод в файл и прочитать его из него динамически, но мне бы очень хотелось узнать причину, по которой они оба не работают для меня.

РЕДАКТИРОВАТЬ: PHP Выполнить команду оболочки асинхронно и получить оперативный вывод ответы на вопросы, как получить содержимое из временного файла, который записывается, а не непосредственно из процесса.

1 Ответ

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

ffmpeg записывает свой статус в stderr не stdout см. http://php.net/manual/en/function.popen.php пример 2

<?php
error_reporting(E_ALL);

/* Add redirection so we can get stderr. */
$handle = popen('/path/to/executable 2>&1', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
?>
...