Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

csaba_szekely's avatar

Video.js player.currentTime()

I have a Laravel project where I have a video playing with video.js.

The simplest thing, if I want to set the player.currentTime() to 5 then the player jumps back to 0.

I searched the net and found something about the headers :

https://stackoverflow.com/questions/67218750/http-range-requests-with-php-for-video-embedding-for-solving-going-to-specific-t

I'm not streaming the video, I have-it in a blade file with other content.

I'm running Laravel with artisan serve.

0 likes
1 reply
LaryAI's avatar
Level 58

It sounds like you need to set up HTTP Range Requests in order to get the player.currentTime() to work properly. You can find more information about this in the link you provided.

Basically, you need to set up a server-side script that will handle the Range Requests. This script should be able to read the Range header from the request and return the appropriate byte range from the video file.

Here is an example of a script that can do this:

<?php

$file = 'video.mp4';

$fp = @fopen($file, 'rb');

$size   = filesize($file); // File size
$length = $size;           // Content length
$start  = 0;               // Start byte
$end    = $size - 1;       // End byte

header('Content-type: video/mp4');
header("Accept-Ranges: 0-$length");

if (isset($_SERVER['HTTP_RANGE'])) {

    $c_start = $start;
    $c_end   = $end;

    // Extract the range string
    list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
    // Make sure the client hasn't sent us a multibyte range
    if (strpos($range, ',') !== false) {
        // (?) Shoud this be issued here, or should the first
        // range be used? Or should the header be ignored and
        // we output the whole content?
        header('HTTP/1.1 416 Requested Range Not Satisfiable');
        header("Content-Range: bytes $start-$end/$size");
        // (?) Echo some info to the client?
        exit;
    }
    // If the range starts with an '-' we start from the beginning
    // If not, we forward the file pointer
    // And make sure to get the end byte if spesified
    if ($range{0} == '-') {
        // The n-number of the last bytes is requested
        $c_start = $size - substr($range, 1);
    } else {
        $range  = explode('-', $range);
        $c_start = $range[0];
        $c_end   = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
    }
    /* Check the range and make sure it's treated according to the specs.
     * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
     */
    // End bytes can not be larger than $end.
    $c_end = ($c_end > $end) ? $end : $c_end;
    // Validate the requested range and return an error if it's not correct.
    if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) {
        header('HTTP/1.1 416 Requested Range Not Satisfiable');
        header("Content-Range: bytes $start-$end/$size");
        // (?) Echo some info to the client?
        exit;
    }
    $start  = $c_start;
    $end    = $c_end;
    $length = $end - $start + 1; // Calculate new content length
    fseek($fp, $start);
    header('HTTP/1.1 206 Partial Content');
}

// Notify the client the byte range we'll be outputting
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: $length");

// Start buffered download
$buffer = 1024 * 8;
while(!feof($fp) && ($p = ftell($fp)) <= $end) {

    if ($p + $buffer > $end) {
        // In case we're only outputtin a chunk, make sure we don't
        // read past the length
        $buffer = $end - $p + 1;
    }
    set_time_limit(0); // Reset time limit for big files
    echo fread($fp, $buffer);
    flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
}

fclose($

Please or to participate in this conversation.