-
-
Save codler/3906826 to your computer and use it in GitHub Desktop.
<?php | |
# Nginx don't have PATH_INFO | |
if (!isset($_SERVER['PATH_INFO'])) { | |
$_SERVER['PATH_INFO'] = substr($_SERVER["ORIG_SCRIPT_FILENAME"], strlen($_SERVER["SCRIPT_FILENAME"])); | |
} | |
$request = substr($_SERVER['PATH_INFO'], 1); | |
$file = $request; | |
$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; | |
list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2); | |
if (strpos($range, ',') !== false) { | |
header('HTTP/1.1 416 Requested Range Not Satisfiable'); | |
header("Content-Range: bytes $start-$end/$size"); | |
exit; | |
} | |
if ($range == '-') { | |
$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; | |
} | |
$c_end = ($c_end > $end) ? $end : $c_end; | |
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"); | |
exit; | |
} | |
$start = $c_start; | |
$end = $c_end; | |
$length = $end - $start + 1; | |
fseek($fp, $start); | |
header('HTTP/1.1 206 Partial Content'); | |
} | |
header("Content-Range: bytes $start-$end/$size"); | |
header("Content-Length: ".$length); | |
$buffer = 1024 * 8; | |
while(!feof($fp) && ($p = ftell($fp)) <= $end) { | |
if ($p + $buffer > $end) { | |
$buffer = $end - $p + 1; | |
} | |
set_time_limit(0); | |
echo fread($fp, $buffer); | |
flush(); | |
} | |
fclose($fp); | |
exit(); | |
?> |
Great! You saved my day too!
Thank you so much! Works!
Han Lin Yap great work. Thank you for sharing.
Everything works fine but for some reason I don't know, when I start playing a video and then click on a link on my page or use the browser's back button, the browser freezes and waits a while ( variable ) before following the link.
The profiler indicates that the requested page change is in pending status.
If I position the video cursor further away, the browser unlocks instantly and follows the link I clicked.And finally if I reload that page, the issue doesn't appears anymore. Seems that chrome have cached the video.
Any idea ?
EDIT
it seems that problem occurs only with chrome..
While debugging script, I saw that value in "Content-range" header always empty.
That's involve that chrome tries to fully load video and not partially. I think this is that causing the issue.Any idea ?
EDIT2
And of course I changedAccept-Ranges: 0-$length
toAccept-Ranges: bytes
Same here... some ideas?
Thanks dude!
I had to implement ranging for video downloading for iOS video player purposes (Flutter) and it works!
I adopted it for Slim framework of course :)
@fadiabualnaser
I think the AWS works, but the AWS sdk package causes memory leak issue when file seek: