来自PHP的FFMPEG(2.5.7)进度条

时间:2015-07-10 03:01:08

标签: php ubuntu ffmpeg preg-match

我想要FFmpeg编码的进度条。这是我用来获取编码过程的百分比值的代码。

<?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警告,我得到了 -

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

我认为我们也可以从time计算百分比,但我不知道,我怎样才能让它发挥作用?

或解决持续时间问题的任何帮助。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

简答:

在此处运行ffMPEG命令之前,应运行以下命令,这将为您提供持续时间。

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

然后你可以用'/Duration: ([0-9]{*}):([0-9]{2}):([0-9]{2}).([0-9]{2})/' preg_match将h,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超时设置为&gt;处理文件所需的时间。