如何使用 gridfs-stream 读取视频?
How to read a video with gridfs-stream?
我正在使用 mongoose 和 gridfs-stream 来存储文件、图像、音频和视频。
问题是当 我 select 视频中的另一个 position/time 停止时,当我播放任何歌曲时也会发生同样的情况。
有人可以帮助我吗?
这是我的代码:
exports.readById = function(req, res) {
var id = req.modelName._id;
gfs.findOne({
_id: id
}, function(err, file) {
if (err) {
return res.status(400).send({
err: errorHandler.getErrorMessage(err)
});
}
if (!file) {
return res.status(404).send({
err: 'No se encontró el registro especificado.'
});
}
res.writeHead(200, {
'Accept-Ranges': 'bytes',
'Content-Length': file.length,
'Content-Type': file.contentType
});
var readStream = gfs.createReadStream({
_id: file._id
});
readStream.on('error', function(err) {
if (err) {
return res.status(400).send({
err: errorHandler.getErrorMessage(err)
});
}
});
readStream.pipe(res);
});
};
需要使用range
选项,它允许我们select在视频的另一个位置播放它。换句话说,向服务器发出请求,以便服务器响应我们需要的数据。
完整代码在此,希望对大家有所帮助
我找到了示例 here。
exports.readById = function(req, res) {
var id = req.modelName._id;
gfs.findOne({
_id: id
}, function(err, file) {
if (err) {
return res.status(400).send({
err: errorHandler.getErrorMessage(err)
});
}
if (!file) {
return res.status(404).send({
err: 'No se encontró el registro especificado.'
});
}
if (req.headers['range']) {
var parts = req.headers['range'].replace(/bytes=/, "").split("-");
var partialstart = parts[0];
var partialend = parts[1];
var start = parseInt(partialstart, 10);
var end = partialend ? parseInt(partialend, 10) : file.length - 1;
var chunksize = (end - start) + 1;
res.writeHead(206, {
'Accept-Ranges': 'bytes',
'Content-Length': chunksize,
'Content-Range': 'bytes ' + start + '-' + end + '/' + file.length,
'Content-Type': file.contentType
});
gfs.createReadStream({
_id: file._id,
range: {
startPos: start,
endPos: end
}
}).pipe(res);
} else {
res.header('Content-Length', file.length);
res.header('Content-Type', file.contentType);
gfs.createReadStream({
_id: file._id
}).pipe(res);
}
});
};
我正在使用 mongoose 和 gridfs-stream 来存储文件、图像、音频和视频。
问题是当 我 select 视频中的另一个 position/time 停止时,当我播放任何歌曲时也会发生同样的情况。
有人可以帮助我吗?
这是我的代码:
exports.readById = function(req, res) {
var id = req.modelName._id;
gfs.findOne({
_id: id
}, function(err, file) {
if (err) {
return res.status(400).send({
err: errorHandler.getErrorMessage(err)
});
}
if (!file) {
return res.status(404).send({
err: 'No se encontró el registro especificado.'
});
}
res.writeHead(200, {
'Accept-Ranges': 'bytes',
'Content-Length': file.length,
'Content-Type': file.contentType
});
var readStream = gfs.createReadStream({
_id: file._id
});
readStream.on('error', function(err) {
if (err) {
return res.status(400).send({
err: errorHandler.getErrorMessage(err)
});
}
});
readStream.pipe(res);
});
};
需要使用range
选项,它允许我们select在视频的另一个位置播放它。换句话说,向服务器发出请求,以便服务器响应我们需要的数据。
完整代码在此,希望对大家有所帮助
我找到了示例 here。
exports.readById = function(req, res) {
var id = req.modelName._id;
gfs.findOne({
_id: id
}, function(err, file) {
if (err) {
return res.status(400).send({
err: errorHandler.getErrorMessage(err)
});
}
if (!file) {
return res.status(404).send({
err: 'No se encontró el registro especificado.'
});
}
if (req.headers['range']) {
var parts = req.headers['range'].replace(/bytes=/, "").split("-");
var partialstart = parts[0];
var partialend = parts[1];
var start = parseInt(partialstart, 10);
var end = partialend ? parseInt(partialend, 10) : file.length - 1;
var chunksize = (end - start) + 1;
res.writeHead(206, {
'Accept-Ranges': 'bytes',
'Content-Length': chunksize,
'Content-Range': 'bytes ' + start + '-' + end + '/' + file.length,
'Content-Type': file.contentType
});
gfs.createReadStream({
_id: file._id,
range: {
startPos: start,
endPos: end
}
}).pipe(res);
} else {
res.header('Content-Length', file.length);
res.header('Content-Type', file.contentType);
gfs.createReadStream({
_id: file._id
}).pipe(res);
}
});
};