Захватить вывод FFMPEG - PullRequest
10 голосов
/ 10 июля 2009

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

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

Вот что я пытался:

<code><?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 "

система:
";
    echo system($command);

    echo "

shell_exec:
";
    echo shell_exec($command);

    echo "

PassThru:
";
    passthru($command);

    echo "

Exec: <бр />
";
    $output = array();
    exec($command,$output,$status);
    foreach($output AS $o)
    {
            echo $o , "<br/>";
    }
    echo "

POPEN:
";
    $handle = popen($command,'r');
    echo fread($handle,1048576);
    pclose($handle);
    echo "

"; ?>

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

<code><B>/usr/bin/ffmpeg -i /var/videos/video1.wmv</B><br/>
backtick:<br/>
    <pre>

Система:
 
shell_exec:
 
PassThru:
 
Exec:
 
POPEN:
 

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

Ответы [ 4 ]

28 голосов
/ 10 июля 2009

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

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

в

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

и попробуй еще раз:)

7 голосов
/ 20 ноября 2012

Вместо этого используйте 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.

3 голосов
/ 02 мая 2017

Чтобы получить выходной статус и вывод:

exec("ffmpeg -i input.avi output.mp4 2>&1", $output, $returnStatus);

print_r($output);

if($returnStatus === 0){
   // success
}
else {
   //fail
}
0 голосов
/ 08 августа 2016

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

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

echo "<pre>";
print_r($output);
echo "
";
...