【发布时间】:2017-02-19 01:42:38
【问题描述】:
这个问题可能有点让人不知所措,但我感觉已经接近理解 Google Chrome 中视频搜索的工作方式了,但我仍然很困惑,而且很难找到支持。
如果我没记错的话,Chrome 最初会发送一个范围为 bytes=0- 的请求标头来测试服务器是否理解 Partial Content 请求,并期望服务器能够以状态码 206 响应。
我已阅读以下答案以获得更好的理解:
需要更多代表来链接它们,他们的主题是:
无法搜索 html5 视频或音频在 chrome 中
HTML5 视频不会循环播放
HTTP Range 标头
我的服务器由 Node.js 提供支持,我在播放期间无法从 chrome 中获取连续范围请求。当请求视频时,服务器收到字节=0-,然后服务器以状态码 206 和 然后媒体播放器中断。
我的困惑在于响应标头,因为我不知道如何 构造我的响应头并处理最终的范围请求:
- 我最初是用状态代码 200 还是 206 响应? 当我回复 206 时,我只收到 bytes=0-,但是当我回复时 200 我收到 bytes=0- 之后是 bytes=355856504-。 如果我从视频文件的总 Content-Length 中减去 355856504,结果是 58,并且 bytes=0-58 似乎是一个有效的 Content-Range? 但在这两个请求之后,我不再收到来自 Chrome 的范围请求。
例如,我也不确定响应标头中的 Content-Range 是否应该类似于“bytes=0-58”或“bytes=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-”
内容范围响应是:
“字节=0-355856562/355856562”
【问题讨论】:
-
为什么不直接使用send?
-
send 库的工作原理就像一个魅力,但我仍然不知道 Partial Content 请求的实现和处理是如何工作的。
-
Chrome 可能会要求
bytes=355856504-获取文件的结尾,因为这是某些视频编码保留播放所需的元数据的地方。见superuser.com/questions/856025/…
标签: node.js google-chrome html5-video