Открытие mp4 через php приводит к полной загрузке перед воспроизведением

Я пытаюсь передать файл mp4 во флеш-плеер через php, и видео полностью загружается перед началом воспроизведения.

$src = '/var/www/user/data/www/domain.com/video.mp4';
if(file_exists($src) and is_readable($src)) {
    header('Content-Type: video/mp4');
    header('Content-Length: '.filesize($src));
    readfile($src);
} else die('error');

Я пробовал скручивать с похожими результатами. Есть идеи, что вызывает эту задержку?

2 ответа

Решение

Скорее всего, ваш Flash-плеер надеется, что вы справитесь с HTTP Range запросы, чтобы он мог начать быстрее при воспроизведении.

Аудиоплеер HTML5/Flash jPlayer имеет раздел в своем руководстве разработчика об этом. Перейдите к части о запросах байтового диапазона:

Ваш сервер должен разрешить запросы Range. Это легко проверить, посмотрев, включает ли ответ вашего сервера Accept-Ranges в его заголовок.

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

smartReadFile.php
https://groups.google.com/forum/

Другой вариант - просто заставить apache отправлять сам файл, а не читать его в php и выводить его на выход с помощью X-Sendfile.

Сначала убедитесь, что apache скомпилирован с поддержкой sendfile, затем измените ваш выходной код так:

header ('X-Sendfile: ' . $src);
header ('Content-Type:  video/mp4');
header ('Content-Disposition: attachment; filename="' . $filename . '"');
exit;

Обычно это быстрее, чем делать это через PHP.

Другие вопросы по тегам