I am working on a safer streaming method for our video player. Since each file requires special authentication by token, and also only each boot token is downloaded once, I launch MP4 through the php container. This works fine inside the HTML5 tag and does not allow users to download the source easily .
I am adapting the code here
<?php include('...'); //include site functions /* Here I connect to the database, and retrieve the location of the video which is returned as $video = "http://domain.tld/folder/file.mp4" This has been removed for this SO example. */ $file = $video; $fp = @fopen($file, 'rb'); $head = array_change_key_case(get_headers($file, TRUE)); $size = $head['content-length']; //$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"); header("Accept-Ranges: bytes"); 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(); ?>
Now there are problems, because I want you to be able to search for videos. Skipping to an area in a video that has not been uploaded breaks the <video> (and chrome).
I would suggest that since the HTML5 player searches in seconds and PHP loads in bytes, this cannot be done. That is why I ask here.
What can I do (if any) to ensure progressive transmission?
Is there a more suitable container format that I could use that would serve the same purpose?
source share