ffmpeg Progress Bar - Encoding Percentage in PHP

后端 未结 3 1914
忘掉有多难
忘掉有多难 2020-11-27 03:30

I\'ve written a whole system in PHP and bash on the server to convert and stream videos in HTML5 on my VPS. The conversion is done by ffmpeg in the background and the conten

3条回答
  •  执念已碎
    2020-11-27 03:44

    Okay, I've found what I needed - and hopefully this helps someone else as well!

    First and foremost, you want to output the ffmpeg data to a text file on the server.

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

    So, the ffmpeg output is block.txt. Now in PHP, let's do this!

    $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 . "
    "; echo "Current Time: " . $time . "
    "; echo "Progress: " . $progress . "%"; }

    This outputs the percentage of time left.

    You can have this as the only piece of text echoed out to a page, and from another page you can perform an AJAX request using jQuery to grab this piece of text and output it into a div, for example, to update on your page every 10 seconds. :)

提交回复
热议问题