视频搜索在谷歌浏览器:如何处理连续的部分内容请求



这个问题可能有点压倒性,但我觉得接近理解视频搜索在Google Chrome中的工作方式,但它仍然让我非常困惑,很难找到支持。

如果我没有错,Chrome最初发送一个请求头与范围字节=0-测试服务器是否理解部分内容请求,并期望服务器响应状态码206

为了更好地理解,我阅读了以下答案:
需要更多的代表链接他们,他们的主题是:
无法在chrome中寻找html5视频或音频
HTML5视频不会循环
HTTP范围头

我的服务器是由Node.js驱动的,我在播放期间无法从chrome中获得连续的范围请求。当请求视频时,服务器接收到一个字节=0-,然后服务器响应状态码206和然后媒体播放器中断

我的困惑是与响应头,因为我不知道如何构造我的响应头并处理最终的范围请求:

  1. 初始状态码是200还是206 ?当我用206响应时,我只收到bytes=0-,但是当我用200我收到bytes=0-,之后的bytes=355856504-。如果我要减去视频文件的总内容长度355856504,结果是58,字节=0-58似乎是一个有效的内容范围?但是在这两个请求之后,我没有收到来自Chrome的更多范围请求。

我也不确定响应头中的内容范围是否应该看起来像"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时请求和响应头的截图:
第一个响应和请求头
第二个响应和请求头

状态码为206时请求和响应头的截图:
需要更多的代表,以显示另一个截图
本质上,请求是:
"范围:字节= 0 -"
Content-Range响应为:
"字节= 0-355856562/355856562"

一个明显的错误是您在Range标头中返回一个无效的值。参见规范-它应该是0-355856561/355856562,因为破折号后的第二个值是最后一个字节位置,而不是长度。

最新更新