Захват вывода FFMPEG

Мне нужно прочитать вывод из ffmpeg, чтобы даже попробовать решение по моему вопросу со вчерашнего дня . Это отдельная проблема из моей проблемы, поэтому я задал новый вопрос.

Как, черт возьми, я получаю вывод из команды ffmpeg -i в PHP?

Это то, что я пытался:

 <?PHP error_reporting(E_ALL); $src = "/var/videos/video1.wmv"; $command = "/usr/bin/ffmpeg -i " . $src; echo "<B>",$command,"</B><br/>"; $command = escapeshellcmd($command); echo "backtick:<br/><pre>"; `$command`; echo "</pre><br/>system:<br/><pre>"; echo system($command); echo "</pre><br/>shell_exec:<br/><pre>"; echo shell_exec($command); echo "</pre><br/>passthru:<br/><pre>"; passthru($command); echo "</pre><br/>exec:<br/><pre>"; $output = array(); exec($command,$output,$status); foreach($output AS $o) { echo $o , "<br/>"; } echo "</pre><br/>popen:<br/><pre>"; $handle = popen($command,'r'); echo fread($handle,1048576); pclose($handle); echo "</pre><br/>"; ?> 

Это мой вывод:

 <B>/usr/bin/ffmpeg -i /var/videos/video1.wmv</B><br/> backtick:<br/> <pre></pre><br/> system:<br/> <pre></pre><br/> shell_exec:<br/> <pre></pre><br/> passthru:<br/> <pre></pre><br/> exec:<br/> <pre></pre><br/> popen:<br/> <pre></pre><br/> 

Я не понимаю. safe_mode выключен. В disable_functions ничего нет. Каталог принадлежит www-data (пользователь apache в моей системе Ubuntu). Я возвращаю действительный статус из exec() и system() и запускаю ту же команду из командной строки, что дает мне тонны вывода. Я чувствую, что я должен упустить что-то очевидное, но я понятия не имею, что это.

Проблема в том, что вы поймаете только stdout и не stderr (см. Стандартные потоки ). Измените эту строку:

 $command = "/usr/bin/ffmpeg -i " . $src; 

в

 $command = "/usr/bin/ffmpeg -i " . $src . " 2>&1"; 

и дать ему еще одну попытку 🙂

Вместо этого используйте ffprobe, это намного быстрее и поддерживает вывод JSON.

 $output = shell_exec('ffprobe -v quiet -print_format json -show_format -show_streams "path/to/yourfile.ext"'); $parsed = json_decode($output, true); 

И у вас есть вся информация о вашем видео в php-массиве! По какой-то причине это намного быстрее, чем ffmpeg -i.

Для получения статуса выхода и вывода:

 exec("ffmpeg -i input.avi output.mp4 2>&1", $output, $returnStatus); print_r($output); if($returnStatus === 0){ // success } else { //fail } 

Вы можете использовать exec и print_r для вывода …

 exec("ffmpeg -i input.avi -vcodec h264 -acodec aac -strict -2 output.mp4 2>&1",$output); echo "<pre>"; print_r($output); echo "</pre>";