【问题标题】:Video seeking in Google Chrome: How to handle continuous Partial Content requests?Google Chrome 中的视频搜索:如何处理连续的部分内容请求?
【发布时间】:2017-02-19 01:42:38
【问题描述】:

这个问题可能有点让人不知所措,但我感觉已经接近理解 Google Chrome 中视频搜索的工作方式了,但我仍然很困惑,而且很难找到支持。

如果我没记错的话,Chrome 最初会发送一个范围为 bytes=0- 的请求标头来测试服务器是否理解 Partial Content 请求,并期望服务器能够以状态码 206 响应。

我已阅读以下答案以获得更好的理解:
需要更多代表来链接它们,他们的主题是:
无法搜索 html5 视频或音频在 chrome 中
HTML5 视频不会循环播放
HTTP Range 标头

我的服务器由 Node.js 提供支持,我在播放期间无法从 chrome 中获取连续范围请求。当请求视频时,服务器收到字节=0-,然后服务器以状态码 206 和 然后媒体播放器中断

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

  1. 我最初是用状态代码 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


【解决方案1】:

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

【讨论】:

  • 但是 0-35585651 是否有效?这似乎是一个荒谬的回应范围。我不确定为什么 Chrome 会请求“bytes=355856504”。
  • 那么只有 33 MB,为什么它应该是无效的? Chrome 只会在您之前在 Content-Length 标头中指定的范围内询问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多