Проблема, с которой я сталкиваюсь, заключается в получении вывода оболочки из команды 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 Выполнить команду оболочки асинхронно и получить оперативный вывод ответы на вопросы, как получить содержимое из временного файла, который записывается, а не непосредственно из процесса.