一尘不染

ffmpeg进度栏-PHP中的编码百分比

php

我已经在服务器上用PHP和bash编写了一个完整的系统,以便在VPS上转换和流式传输HTML5中的视频。转换由ffmpeg在后台完成,其内容输出到
block.txt

除其他外,我找不到有效的例子。

我需要获取当前编码进度的百分比。

我上面链接的第一篇文章给出了:

$log = @file_get_contents('block.txt');

preg_match("/Duration:([^,]+)/", $log, $matches);
list($hours,$minutes,$seconds,$mili) = split(":",$matches[1]);
$seconds = (($hours * 3600) + ($minutes * 60) + $seconds);
$seconds = round($seconds);

$page = join("",file("$txt"));
$kw = explode("time=", $page);
$last = array_pop($kw);
$values = explode(' ', $last);
$curTime = round($values[0]);
$percent_extracted = round((($curTime * 100)/($seconds)));

echo $percent_extracted;

$ percent_extracted变量回显零,由于数学不是我的强项,所以我真的不知道如何在这里继续。

这是来自block.txt的ffmpeg输出的一行(如果有帮助的话)

时间= 00:19:25.16比特率= 823.0kbits / s帧= 27963 fps = 7 q = 0.0大小= 117085kB时间=
00:19:25.33比特率= 823.1kbits / s帧= 27967 fps = 7 q = 0.0大小= 117085kB时间=
00:19:25.49比特率= 823.0kbits / s帧= 27971 fps = 7 q = 0.0大小= 117126kB

请帮助我输出此百分比,完成后即可创建自己的进度栏。谢谢。


阅读 303

收藏
2020-05-29

共1个答案

一尘不染

好的,我已经找到了我所需要的-希望这对其他人也有帮助!

首先,您希望将ffmpeg数据输出到服务器上的文本文件。

ffmpeg -i path/to/input.mov -vcodec videocodec -acodec audiocodec path/to/output.flv 1> block.txt 2>&1

因此,ffmpeg的输出为block.txt。 现在在PHP中,让我们开始吧!

$content = @file_get_contents('../block.txt');

if($content){
    //get duration of source
    preg_match("/Duration: (.*?), start:/", $content, $matches);

    $rawDuration = $matches[1];

    //rawDuration is in 00:00:00.00 format. This converts it to seconds.
    $ar = array_reverse(explode(":", $rawDuration));
    $duration = floatval($ar[0]);
    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 . "%";

}

这将输出剩余时间的百分比。

您可以将其作为回传到页面的唯一文本,并且可以在另一个页面上使用jQuery执行AJAX请求,以获取该文本并将其输出到div中,例如,在每个页面上更新10秒

2020-05-29