如何在每次迭代中获取popen()回调的最后一行?

时间:2017-05-29 14:47:04

标签: php laravel ffmpeg

我正在尝试使用php和AJAX创建一个使用FFMPEG的进度条。当用户上传视频文件时,我希望能够显示当前的百分比直到完成。我设法使一切正常,但我有一个问题。

数据返回我想要的内容,但它也会返回前一次迭代中的所有数据...就像它只是将所有内容堆叠在一起而不是从先前的迭代中清除数据。我试图使用tail认为它只返回最后一行,但它没有返回任何内容。

以下是我正在使用的代码:

encode.php

$video_path = 'test.mp4';
$cmd        = 'ffmpeg -i ' . $video_path .' -y -hide_banner output.mp4 2>&1';

while (@ ob_end_flush());

$proc = popen($cmd, 'r');

while (!feof($proc))
{

    $file = escapeshellarg(fread($proc, 4096));
    //$line = `tail -n 1 $file`; // <-tried this with no luck
    echo fread($file, 4096) . "\n";
    @ flush();
}
return 'complete';
pclose($proc);

上面的代码返回:

// first iteration
frame=   52 fps= 13 q=29.0 size=     279kB time=00:00:00.10 bitrate=22856.9kbits/s

// second iteration
frame=   52 fps= 13 q=29.0 size=     279kB time=00:00:00.10 bitrate=22856.9kbits/s    
frame=   54 fps= 12 q=29.0 size=     329kB time=00:00:00.16 bitrate=16146.6kbits/s 

// third iteration
frame=   52 fps= 13 q=29.0 size=     279kB time=00:00:00.10 bitrate=22856.9kbits/s    
frame=   54 fps= 12 q=29.0 size=     329kB time=00:00:00.16 bitrate=16146.6kbits/s    
frame=   57 fps= 11 q=29.0 size=     464kB time=00:00:00.26 bitrate=14233.2kbits/s 

正如您可以看到数据堆栈,我只需要新的数据行,而不是数据堆栈。

**编辑**这已被标记为重复,而不是我解释它是如何不同的,我想听听这是怎么回事?我不是写日志文件,和大多数人一样,不觉得这是一个很好的解决方案。

1 个答案:

答案 0 :(得分:0)

在刷新方法之前需要清洁缓冲区

ob_clean