video.class.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. class video
  3. {
  4. static public function stream(array $file)
  5. {
  6. $filePath = "../video/".$file["md5"] . ".mp4";
  7. if (!file_exists($filePath)) {
  8. header("HTTP/1.0 404 Not Found");
  9. exit;
  10. }
  11. $fileSize = filesize($filePath);
  12. $range = 0;
  13. $length = $fileSize;
  14. // Gestion des requêtes partielles (Range)
  15. if (isset($_SERVER['HTTP_RANGE'])) {
  16. $range = $_SERVER['HTTP_RANGE'];
  17. $range = str_replace('bytes=', '', $range);
  18. $range = explode('-', $range);
  19. $start = intval($range[0]);
  20. $end = isset($range[1]) && is_numeric($range[1]) ? intval($range[1]) : $fileSize - 1;
  21. if ($start > $end || $end >= $fileSize) {
  22. header("HTTP/1.1 416 Requested Range Not Satisfiable");
  23. exit;
  24. }
  25. $length = $end - $start + 1;
  26. header("HTTP/1.1 206 Partial Content");
  27. header("Content-Range: bytes $start-$end/$fileSize");
  28. } else {
  29. $start = 0;
  30. $end = $fileSize - 1;
  31. }
  32. // En-têtes HTTP pour le streaming
  33. header("Content-Type: " . $file["type"]);
  34. header("Content-Length: $length");
  35. header("Accept-Ranges: bytes");
  36. $fp = fopen($filePath, 'rb');
  37. fseek($fp, $start);
  38. $bufferSize = 1024 * 8;
  39. $bytesSent = 0;
  40. // Lecture de la vidéo par morceaux
  41. while (!feof($fp) && ($bytesSent < $length)) {
  42. $buffer = fread($fp, $bufferSize);
  43. echo $buffer;
  44. flush(); // Vide le tampon de sortie
  45. $bytesSent += strlen($buffer);
  46. }
  47. fclose($fp);
  48. }
  49. }