2016-10-10 3 views
2

Этот вопрос может быть немного подавляющим, но я чувствую себя ближе к пониманию того, как работает поиск видео в Google Chrome, но он все еще очень запутан для меня, и его трудно найти.Поиск видео в Google Chrome: как обрабатывать непрерывные запросы на частичный контент?

Если я не ошибаюсь, Chrome изначально посылает заголовок запроса с диапазоном байт = 0., чтобы проверить, если сервер понимает Partial Content запросы и ожидает ответа сервера с кодом состояния 206 .

Я прочитал следующие ответы, чтобы получить лучшее понимание:
нужно больше, респ связать их, их темы:
не искать html5 видео или аудио в хроме
HTML5 видео не будет петля
заголовка Range HTTP

Мой сервер работает на Node.js и у меня возникли проблемы с получением Continu из диапазона во время воспроизведения. Когда запрашивается видео, сервер получает байты = 0-, тогда сервер отвечает кодом состояния 206 и , тогда медиаплеер перерывает.

Моя путаница с с заголовком ответа, потому что я не знаю, как построить мой заголовок ответа и обрабатывать возможные запросы диапазона:

  1. ли я реагирующие с кодом или изначально? Когда я отвечаю Я получаю только байты = 0-, но когда я отвечаю Я получаю bytes = 0- и после этого байты = 355856504-. Если бы я должен был вычесть 355856504 из общей длины контента видеофайла, результат равен 58, а байты = 0-58, как действительный Content-Range? Но после этих двух запросов я не получаю больше запросов диапазона от Chrome.

Я также не уверен, что Content-Range в заголовке ответа должен выглядеть, например, как «bytes = 0-58» или «байты = 0-58/355856562».

Вот код

if(req.headers.range) console.info(req.headers.range); // prints bytes=0- 

const type = rc.sync(media, 0, 32); // determines mime type 
const size = fs.statSync(media)["size"]; // determines content length 

// String range, initially "bytes=0-" according to Chrome 
var Strange = req.headers.range; 

res.set({ 
    "Accept-Ranges": "bytes", 
    "Content-Type": ft(type).mime, 
    "Content-Length": size-Strange.replace(/bytes=/, "").split("-")[0], 
    "Content-Range": Strange+size+"/"+size 
}); 

//res.status(206); // one request from chrome, then breaks 
res.status(200); // two requests from chrome, then breaks 

// this prints 35585604-58, whereas i expect something like 0-58 
console.log("should serve range: "+ 
    parseInt(Strange.replace(/bytes=/, "").split("-")[0]) +"-"+ 
    parseInt(size-Strange.replace(/bytes=/, "").split("-")[0]) 
); 

// this function reads some bytes from 'media', and then streams it: 
fs.createReadStream(media, { 
    start: 0, 
    end: parseInt(size-Strange.replace(/bytes=/, "").split("-")[0]) // 58 
}).pipe(res); 

Скриншоты из заголовков запросов и ответов, когда код состояния 200:
first response and request headers
second response and request headers

Скриншот заголовка запроса и ответа, когда код состояния 206 :
Необходимо больше изображений, чтобы показать другим снимком экрана
По существу запроса:
"Диапазон: байт = 0."
и ответ Content-Range является:
"байт = 0-355856562/355856562"

+0

Почему бы просто не использовать [отправить] (https://github.com/pillarjs/send)? – idbehold

+0

Я попробую и вернусь к тому, спасибо. – Joey

+0

Библиотека отправки работает как шарм, но я до сих пор не знаю, как точно работают реализация и обработка запросов частичного контента. – Joey

ответ

0

Одна очевидная ошибка в том, что вы возвращаете недопустимое значение в заголовке Range. См. sepcification - он должен быть 0-355856561/355856562, так как второе значение после тире - это последняя позиция байта не длина.

+0

Но верно ли 0-35585651? Это кажется абсурдным большим диапазоном для ответа. Я не уверен, почему Chrome запрашивает «bytes = 355856504». – Joey

+0

Ну, это всего лишь 33 МБ, почему это неправда? Chrome задает только диапазон, который вы указали где-то ранее в заголовке Content-Length. –

 Смежные вопросы

  • Нет связанных вопросов^_^