视频请求中缺少范围标头?

时间:2015-08-05 23:55:00

标签: javascript node.js video

我有时会在我的Node.js服务器上收到错误,告诉我req.headers.range在用户请求.mp4时未定义(我还没有尝试过提供任何其他视频文件类型,但不确定如果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

2 个答案:

答案 0 :(得分:3)

Range标头是可选的:

  

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

请求是否适用于视频流无关紧要。我认为浏览器(或视频播放器库)不会为初始请求发送Range标头,只会在搜索过程中使用它。

答案 1 :(得分:1)

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