Мне нужно прочитать вывод из 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>";