-
-
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-$lengthtoAccept-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: