我正在使用 mongoose 与 gridfs-stream 来存储文件,图片,音频和视频。
问题是,当我在视频中选择另一个位置/时间时,停止播放,播放任何歌曲时也是如此。
有人可以帮助我吗?
这是我的代码:
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);
});
};
答案 0 :(得分:4)
必须使用range
选项,它允许我们选择视频中的其他位置并播放它。换句话说,向服务器发出请求,以便服务器响应我们需要的数据。
这是完整的代码,我希望他们能为某人服务。
我找到了示例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);
}
});
};