| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- <?php
- class video
- {
- static public function stream(array $file)
- {
- $filePath = "../video/".$file["md5"] . ".mp4";
-
- if (!file_exists($filePath)) {
- header("HTTP/1.0 404 Not Found");
- exit;
- }
- $fileSize = filesize($filePath);
- $range = 0;
- $length = $fileSize;
- // Gestion des requêtes partielles (Range)
- if (isset($_SERVER['HTTP_RANGE'])) {
- $range = $_SERVER['HTTP_RANGE'];
- $range = str_replace('bytes=', '', $range);
- $range = explode('-', $range);
- $start = intval($range[0]);
- $end = isset($range[1]) && is_numeric($range[1]) ? intval($range[1]) : $fileSize - 1;
- if ($start > $end || $end >= $fileSize) {
- header("HTTP/1.1 416 Requested Range Not Satisfiable");
- exit;
- }
- $length = $end - $start + 1;
- header("HTTP/1.1 206 Partial Content");
- header("Content-Range: bytes $start-$end/$fileSize");
- } else {
- $start = 0;
- $end = $fileSize - 1;
- }
- // En-têtes HTTP pour le streaming
- header("Content-Type: " . $file["type"]);
- header("Content-Length: $length");
- header("Accept-Ranges: bytes");
- $fp = fopen($filePath, 'rb');
- fseek($fp, $start);
- $bufferSize = 1024 * 8;
- $bytesSent = 0;
- // Lecture de la vidéo par morceaux
- while (!feof($fp) && ($bytesSent < $length)) {
- $buffer = fread($fp, $bufferSize);
- echo $buffer;
- flush(); // Vide le tampon de sortie
- $bytesSent += strlen($buffer);
- }
- fclose($fp);
- }
- }
|