Как предложил Wrikken , это правильный запрос.Это также довольно часто, когда клиент запрашивает носитель или возобновляет загрузку.
Клиент часто проверяет, обрабатывает ли сервер другие запросы, кроме простого поиска ответа Accept-Ranges
.Chrome всегда отправляет Range: bytes=0-
с первым GET-запросом на видео, поэтому вы не можете его отклонить.
Всякий раз, когда клиент включает Range:
в свой запрос, даже еслион искажен, он ожидает частичного ответа (206).При поиске вперед во время воспроизведения видео HTML5 браузер запрашивает только начальную точку.Например:
Range: bytes=3744-
Итак, чтобы клиент правильно воспроизводил видео, ваш сервер должен иметь возможность обрабатывать эти неполные запросы диапазона.
Вы можете обрабатывать тип «диапазона», который вы указали в своем вопросе, двумя способами:
Сначала вы можете ответить с запрошенной отправной точкой, указанной в ответе, затем с общей длинойфайл минус один (запрошенный диапазон байтов индексируется нулем).Например:
Запрос:
GET /BigBuckBunny_320x180.mp4
Range: bytes=100-
Ответ:
206 Partial Content
Content-Type: video/mp4
Content-Length: 64656927
Accept-Ranges: bytes
Content-Range: bytes 100-64656926/64656927
Во-вторых, вы можете ответить с начальной точкой, указанной в запросе, и открытым файломдлина (размер).Это для веб-трансляций или других средств массовой информации, где общая длина неизвестна.Например:
Запрос:
GET /BigBuckBunny_320x180.mp4
Range: bytes=100-
Ответ:
206 Partial Content
Content-Type: video/mp4
Content-Length: 64656927
Accept-Ranges: bytes
Content-Range: bytes 100-64656926/*
Советы:
Вы всегда должны отвечатьдлина контента включена в диапазон.Если диапазон завершен, с начала до конца, то длина содержимого - это просто разница:
Запрос: Диапазон: байты = 500-1000
Ответ: Диапазон содержимого: байты 500-1000/123456
Помните, что диапазон индексируется нулем, поэтому Range: bytes=0-999
фактически запрашивает 1000 байтов, а не 999, поэтому ответьте что-то вроде:
Content-Length: 1000
Content-Range: bytes 0-999/123456
Или:
Content-Length: 1000
Content-Range: bytes 0-999/*
Но, если возможно, избегайте последнего метода, потому что некоторые медиапроигрыватели пытаются определить длительность по размеру файла.Если ваш запрос касается медиа-контента, что является моей догадкой, то вы должны указать его продолжительность в ответе.Это делается в следующем формате:
X-Content-Duration: 63.23
Это должно быть число с плавающей запятой.В отличие от Content-Length
, это значение не обязательно должно быть точным.Он используется, чтобы помочь игроку искать видео.Если вы транслируете веб-трансляцию и имеете общее представление о том, как долго это будет продолжаться, лучше указать предполагаемую продолжительность, а не полностью ее игнорировать.Таким образом, для двухчасовой веб-трансляции вы можете включить что-то вроде:
X-Content-Duration: 7200.00
В некоторых типах мультимедиа, таких как webm, вы также должны указать тип контента, например:
Content-Type: video/webm
Все это необходимо для правильного воспроизведения мультимедиа, особенно в HTML5.Если вы не указали длительность, игрок может попытаться определить длительность (чтобы разрешить поиск) по размеру файла, но это не будет точным.Это нормально и необходимо для веб-трансляций или потокового вещания, но не идеально для воспроизведения видеофайлов.Вы можете извлечь длительность, используя программное обеспечение, такое как FFMPEG, и сохранить его в базе данных или даже в имени файла.
X-Content-Duration
постепенно сокращается в пользу Content-Duration
, поэтому я бы добавил и это.Основной ответ на запрос «0-» будет включать, по крайней мере, следующее:
HTTP/1.1 206 Partial Content
Date: Sun, 08 May 2013 06:37:54 GMT
Server: Apache/2.0.52 (Red Hat)
Accept-Ranges: bytes
Content-Length: 3980
Content-Range: bytes 0-3979/3980
Content-Type: video/webm
X-Content-Duration: 2054.53
Content-Duration: 2054.53
Еще один момент: Chrome всегда начинает свой первый видео-запрос со следующего:
Range: bytes=0-
Некоторые серверы отправляют обычный ответ 200 в качестве ответа, который он принимает (но с ограниченными параметрами воспроизведения), но вместо этого попробуйте отправить 206, чтобы показать, что ваш сервер обрабатывает диапазоны. RFC 2616 говорит, что допустимо игнорировать заголовки диапазона.