Почему PHP мешает моему видео HTML5 MP4?

Я пишу веб-приложение, которое обслуживает видео в формате MP4, закодированное H.264. В Chrome и Safari это делается с помощью тега HTML5.

Чтобы контролировать доступ к этим видео, их содержимое подается через PHP, используя действительно простой механизм:

header('Content-type: video/mp4'); readfile($filename); exit; 

Независимо от того, что я делаю, видео не будет транслироваться. Дополнительно:

  • Если я изменил исходный код, чтобы напрямую обслуживать файлы, используя один и тот же тег для видео, но, ссылаясь на копию видео с поддержкой Apache без сквозной передачи PHP, потоковая передача работает нормально.
  • Даже когда потоковая передача не работает, я всегда могу щелкнуть правой кнопкой мыши на сером HTML5-проигрывателе и загрузить файл через сквозной проход PHP – и он отлично работает в автономном режиме.

Есть идеи? Я вытаскиваю волосы!

Может быть. Попробуйте добавить также заголовок длины содержимого:

 header('Content-length: '.filesize($filename)); 

Если это все еще не работает, проверьте выходной файл перед readfile ( echo или пробел перед <?php ). Проверьте также, что у вас нет пробелов после ?> Или просто опустить ?> (Это не обязательно, если после этого ничего не получилось).

Как отметил Бруно, для поддержки потоковой передачи вам также необходимо подчиняться заголовку Range . Вот упрощенный пример, который касается только левой границы:

 if (empty($_SERVER["HTTP_RANGE"])) { //do your current stuff... } else { //violes rfc2616, which requires ignoring the header if it's invalid preg_match("/^bytes=(\d+)-/i",$_SERVER["HTTP_RANGE"], $matches); $offset = (int) $matches[1]; if ($offset < $filesize && $offset >= 0) { if (@fseek($fp, $offset, SEEK_SET) != 0) die("err"); header("HTTP/1.1 206 Partial Content"); header("Content-Range: bytes $offset-".($filesize - 1)."/$filesize"); } else { header("HTTP/1.1 416 Requested Range Not Satisfiable"); die(); } //fread in loop here } 

При потоковой передаче файлов на встроенный видеоплеер HTML5 вам все равно придется добавлять заголовки, которые информируют игрока о информации о видео.

вы не можете просто ожидать выполнения команды read readfile() и все будет работать магически, извините, но программирование не так просто. (Хотел бы это было).

это небольшое приложение, которое вы можете использовать для правильного воспроизведения или просто обучения.

http://stream.xmoov.com/download/xmoov-php/

См. Комментарии!

Использование файла чтения не рекомендуется для потоковой передачи видеофайлов, так как он загружает весь файл в память перед выводом. Это приводит к серьезным проблемам с исчерпанием памяти.

Попробуйте прочитать и вывести кусок файла куском.