【问题标题】:Range header missing from video request?视频请求中缺少范围标头?
【发布时间】:2015-10-28 22:44:05
【问题描述】:

当用户请求 .mp4 时,我的 Node.js 服务器有时会收到错误消息,告诉我 req.headers.range 未定义(我没有尝试提供任何其他视频文件类型,不确定 mp4 是否相关)。我不明白为什么缺少此标头。

视频的请求标头是否有时应排除range

我这样发送流:

var videoReqHandler = function(req, res, pathname) {

    var file = dirPath + "/Client" + pathname;
    var range = req.headers.range;
    var positions = range.replace(/bytes=/, "").split("-");
    var start = parseInt(positions[0], 10);

    fs.stat(file, function(err, stats) {
        if (err) {
            throw err;
        } else {
            var total = stats.size;
            var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
            var chunksize = (end - start) + 1;
            res.writeHead(206, {
                "Content-Range" : "bytes " + start + "-" + end + "/" + total,
                "Accept-Ranges" : "bytes",
                "Content-Length" : chunksize,
                "Content-Type" : "video/mp4"
            });
            var stream = fs.createReadStream(file, {
                start : start,
                end : end
            }).on("open", function() {
                stream.pipe(res);
            }).on("error", function(err) {
                res.end(err);
            });
        }
    });
};

错误:

/video_stream.js:21
        var positions = range.replace(/bytes=/, "").split("-");
        TypeError: Cannot call method 'replace' of undefined

【问题讨论】:

    标签: javascript node.js video


    【解决方案1】:

    Range 标头是可选的:

    使用有条件或无条件 GET 方法的 HTTP 检索请求可以使用 Range 请求标头请求实体的一个或多个子范围,而不是整个实体 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2)

    请求是否针对视频流并不重要。我会假设浏览器(或视频播放器库)不会为初始请求发送 Range 标头,并且仅在搜索期间使用它。

    【讨论】:

      【解决方案2】:

      您应该确保您正在响应 GET 请求。可能是浏览器正在发送 HEAD 请求以获取文件信息。 HEAD 请求不包含范围标头。

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,并通过@robertklep 的回答解决了这个问题,感谢他。 我正在为仍有问题的任何人发布我的答案。

        对于我所理解的https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.27

        我试过了

        let range = req.headers.range
        if(!range) range = 'bytes=0-'
        ...
        

        并且成功了!

        因为,range 最初可能未定义,然后它会更新。即使有range,它的初始值也是bytes=0-。随着流的进行,根据您的 chunkSize,它将类似于 bytes=1000001-

        所以如果范围未定义,我将自己设置为初始请求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-27
          • 2014-10-11
          • 2015-06-13
          • 2018-04-15
          • 2018-04-06
          • 2018-10-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多