Я пишу веб-приложение, которое обслуживает видео в формате MP4, закодированное H.264. В Chrome и Safari это делается с помощью тега HTML5.
Чтобы контролировать доступ к этим видео, их содержимое подается через PHP, используя действительно простой механизм:
header('Content-type: video/mp4'); readfile($filename); exit;
Независимо от того, что я делаю, видео не будет транслироваться. Дополнительно:
Есть идеи? Я вытаскиваю волосы!
Может быть. Попробуйте добавить также заголовок длины содержимого:
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()
и все будет работать магически, извините, но программирование не так просто. (Хотел бы это было).
это небольшое приложение, которое вы можете использовать для правильного воспроизведения или просто обучения.
См. Комментарии!
Использование файла чтения не рекомендуется для потоковой передачи видеофайлов, так как он загружает весь файл в память перед выводом. Это приводит к серьезным проблемам с исчерпанием памяти.
Попробуйте прочитать и вывести кусок файла куском.