2015-07-10 3 views
1

Я хочу иметь индикатор выполнения FFmpeg encoding.This - это код, который я использую для получения процентного значения процесса кодирования.FFMPEG (2.5.7) Progress Bar от PHP

<?php 
$content = @file_get_contents("with-logo/output.txt"); 
//echo $content; 
if($content) { 
    preg_match("/Duration: (.*?), start:/", $content, $matches); 

    $rawDuration = $matches[1]; 

    $ar = array_reverse(explode(":", $rawDuration)); 
    $duration = floatval($ar[0]); 
    //echo $duration; 
    if (!empty($ar[1])) $duration += intval($ar[1]) * 60; 
    if (!empty($ar[2])) $duration += intval($ar[2]) * 60 * 60; 

    //get the time in the file that is already encoded 
    preg_match_all("/time=(.*?) bitrate/", $content, $matches); 

    $rawTime = array_pop($matches); 

    //this is needed if there is more than one match 
    if (is_array($rawTime)){$rawTime = array_pop($rawTime);} 

    //rawTime is in 00:00:00.00 format. This converts it to seconds. 
    $ar = array_reverse(explode(":", $rawTime)); 
    $time = floatval($ar[0]); 
    if (!empty($ar[1])) $time += intval($ar[1]) * 60; 
    if (!empty($ar[2])) $time += intval($ar[2]) * 60 * 60; 

    //calculate the progress 
    $progress = round(($time/$duration) * 100); 

    echo "Duration: " . $duration . "<br>"; 
    echo "Current Time: " . $time . "<br>"; 
    echo "Progress: " . $progress . "%"; 
} 
?> 

вот релевантная строка журнала, в которой хранятся файлы журнала FFMPEG для лучшего понимания.

Stream mapping: 
    Stream #0:0 -> #0:0 (mpeg2video (native) -> h264 (libx264)) 
    Stream #0:1 -> #0:1 (pcm_s24le (native) -> aac (native)) 
Press [q] to stop, [?] for help 

frame= 11 fps=0.0 q=0.0 size=  0kB time=00:00:00.41 bitrate= 0.9kbits/s  
frame= 22 fps= 21 q=0.0 size=  0kB time=00:00:00.85 bitrate= 0.4kbits/s  
frame= 33 fps= 21 q=0.0 size=  0kB time=00:00:01.30 bitrate= 0.3kbits/s  
frame= 43 fps= 20 q=0.0 size=  0kB time=00:00:01.69 bitrate= 0.2kbits/s 

и этот код не возвращает значение для Duration и в результате этого я получаю предупреждение PHP и код не вычисляя Текущий процент.

здесь предупреждение PHP, которую я getting-

PHP Warning: Division by zero in /var/www/html/mm/progressbar.php 

я думаю, мы можем вычислить процент от time, но я понятия не имею, как я могу заставить его работать?

или любая помощь для решения проблемы с длительностью.

благодарит за помощь!

ответ

1

Короткий ответ:

Перед тем, как запустить команду FFmpeg здесь, вы должны выполнить следующую команду, и это даст вам срок.

ffmpeg -i file.flv 2>&1 | grep "Duration" 
    Duration: 00:39:43.08, start: 0.040000, bitrate: 386 kb/s 

Вы можете затем preg_match, что трейлеры '/Duration: ([0-9]{*}):([0-9]{2}):([0-9]{2}).([0-9]{2})/' получить ч, M, S и .s в переменные.

Длинный ответ

Существует еще один способ, которым Вы можете обращаться. В отличие от использования PHP-FFmpeg, просто работать, какие команды вам нужно, и запускать их непосредственно с помощью POPEN() (http://php.net/manual/en/function.popen.php) или proc_open() (http://php.net/manual/en/function.proc-open.php)

$cmd = "/path/to/ffmpeg -options"; 
$proc = popen($cmd, 'r'); 
while (!feof($proc)) 
{ 
    echo fread($proc, 4096); 
    @flush(); 
} 
pclose($proc); 

Это по существу будет держать процесс открытым для вас команда запускается и захватывает выходные данные с экрана, когда это происходит.

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

Не забудьте установить тайм-аут PHP на> время, необходимое для обработки файла.

+0

Hi @Robbbie! Второй вариант, который вы предложили, я скоро попробую, но теперь для получения значения Duration, я запустил команду вручную в оболочке, которую вы предложили «ffmpeg /tmp/out.mp4 2> & 1 | grep «Продолжительность». и я не получил никакой обратной связи, он просто застрял без ответа. – kunal

+0

В ваших инструкциях отсутствует -i? – Robbie

+0

oh man! я сожалею, я просто пропустил это., ты качаешь спасибо @ Robbie – kunal