Этот вопрос может быть немного подавляющим, но я чувствую себя ближе к пониманию того, как работает поиск видео в Google Chrome, но он все еще очень запутан для меня, и его трудно найти.Поиск видео в Google Chrome: как обрабатывать непрерывные запросы на частичный контент?
Если я не ошибаюсь, Chrome изначально посылает заголовок запроса с диапазоном байт = 0., чтобы проверить, если сервер понимает Partial Content запросы и ожидает ответа сервера с кодом состояния 206 .
Я прочитал следующие ответы, чтобы получить лучшее понимание:
нужно больше, респ связать их, их темы:
не искать html5 видео или аудио в хроме
HTML5 видео не будет петля
заголовка Range HTTP
Мой сервер работает на Node.js и у меня возникли проблемы с получением Continu из диапазона во время воспроизведения. Когда запрашивается видео, сервер получает байты = 0-, тогда сервер отвечает кодом состояния 206 и , тогда медиаплеер перерывает.
Моя путаница с с заголовком ответа, потому что я не знаю, как построить мой заголовок ответа и обрабатывать возможные запросы диапазона:
- ли я реагирующие с кодом или изначально? Когда я отвечаю Я получаю только байты = 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"
Почему бы просто не использовать [отправить] (https://github.com/pillarjs/send)? – idbehold
Я попробую и вернусь к тому, спасибо. – Joey
Библиотека отправки работает как шарм, но я до сих пор не знаю, как точно работают реализация и обработка запросов частичного контента. – Joey