Итак, у меня есть файл getVideo.php, который принимает переменную get id $, соответствующую определенному видео. Если я сохраню видеофайл в корне сети и использую его непосредственно в качестве источника, все прекрасно работает.
Теперь я разместил видео вне корневого веб-каталога, чтобы я мог использовать getVideo.php для определения прав доступа. Предполагая, что доступ предоставлен, часть кода, соответствующая отправке видеофайла в getVideo.php
$filePath = VIDEOBASEURL.$guideData['video_url'];
if (file_exists($filePath)){
//header('Content-Type: '.mime_content_type($filePath));
header('Content-Type: video/mp4');
header('Content-Length: '.filesize($filePath));
readfile($filePath);
}
Теперь это работает нормально, так как видео будет воспроизводиться, когда, например, в качестве источника используется getVideo.php? Id = 1. Проблема в том, что больше невозможно переходить к произвольным частям видео. На самом деле вы не можете прыгать нигде в видео, будь то вперед или назад, и вы даже не можете перетащить индикатор прогресса. Все, что вы можете сделать, это посмотреть видео от начала до конца. Я не совсем уверен, что я делаю неправильно, что может вызвать такое поведение.
Тестовый файл на самом деле является файлом .mp4, и когда я напрямую связываюсь с его копией в веб-корне, все работает нормально — только когда он проходит через версию getVideo.php с контролируемым доступом, я не могу пропустить видео , Вместо этого, щелчок, чтобы пропустить, просто приостанавливает видео.
РЕДАКТИРОВАТЬ — Это на самом деле не зависит от video.js. При попытке просмотра видео непосредственно из файла getVideo.php, поэтому при использовании всего, что встроено в Chrome / Firefox, видео не может перескочить даже там. Я предполагаю, что каким-то образом неправильно возвращаю видеофайл.
Это, скорее всего, потому что вы пытаетесь потоковое видео из файла PHP. Каждый раз, когда вы запрашиваете этот PHP-файл, он должен перечитывать файл mp4, вместо того, чтобы сервер возвращал байты в указанной точке файла. В долгосрочной перспективе этот подход, вероятно, не будет работать, и вам следует просто ограничить доступ к странице с помощью элемента video.
Ключевое слово для этой темы — «запросы диапазона байтов».
Я думаю, что каждый браузер сегодня пытается загрузить видео, используя HTTP_RANGE в заголовке HTTP, сообщая серверу просто отправить определенную часть файла. На мобильных устройствах нет другого способа загрузить видео на веб-страницу.
Таким образом, вы должны были обработать запрос диапазона самостоятельно в PHP.
Отправляя видео таким образом, у вас будет возможность искать любую позицию в видео, даже если она еще не буферизована (это не так для флэш-плееров!).
На быстром я нашел эту страницу. В «Приложении A: Потоковая передача для Apple iPhone» вы найдете PHP-скрипт, который вы можете легко расширить для проверки прав доступа.
mobiforge.com/design-development/content-delivery-mobile-devices
Я не проверял сценарий, но он выглядит хорошо. Я использую один и тот же подход годами в системе управления видео активами, и она работает без проблем. Пример PHP выше не обрабатывал запросы «многобайтового диапазона», но я думаю, что это не имеет значения для видео. Единственный клиент, который обнаружил использование многобайтовых запросов диапазона, это плагин Adobe PDF Reader.
Этот подход также подходит для любого типа загрузок, чтобы позволить брату возобновить загрузку или плагины Download-Manager для загрузки одного файла во многих потоках.
Для всей истории смотрите: www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.1
РЕДАКТИРОВАТЬ:
Я только что нашел ошибку в этом сценарии PHP:
В функции rangeDownload () поиск строки
if ($range0 == '-') {
и заменить его на:
if ($range[0] == '-') {
Существует также проблема, если браузер не отправляет запрос HTTP_RANGE.
В этом случае скрипт будет использовать PHP readfile (). Я думаю, что readfile () прочитал весь файл в память (по крайней мере, это было правдой в прошлом). Для доставки видео многим пользователям это серьезная проблема. Поэтому не используйте readfile () для больших файлов. Вместо этого отправьте файл кусками, как в «// Начать буферизованную загрузку» в конце скрипта.
Я надеюсь, что нет никаких других проблем.