我还是节点的新手,所以请耐心等待。
我有存储在mongo gridfs中的图像。如何调整图像流的大小?我正在尝试使用ffmpeg。这是我的方法:
exports.read = function (req, res) {
var db = mongoose.connection.db;
var id = new ObjectID(req.params.imageId);
var store = new GridStore(db, id, 'r', {root: 'fs'});
store.open(function (err, store) {
if (err) return err;
res.header("Content-Type", store.metadata['Content Type']);
res.header("Content-Disposition", "attachment; filename='" + store.filename + "'");
new ffmpeg()
.input(store.stream(true))
.size('650x365')
.output('/temp/screenshot.png')
.run();
store.stream(true).pipe(res)
});
};
但是我收到了一个错误:
错误:ffmpeg退出代码1:pipe:0:处理输入时找到无效数据。
我做错了什么?
答案 0 :(得分:1)
在GridStore
完成运行之前,您已将res
流传输到ffmpeg
,这可能会导致各种不可预测的结果。此外,您管道res
的流来自GridStore
,而不是ffmpeg
的输出。因此,即使ffmpeg
确实正确运行,您也不会获得原始图片,而不是调整后的图片。
自从我使用GridStore
和ffmpeg
以来已经有一段时间了,所以我生气了,但我快速浏览了一下这些文档,我认为你想要这样的东西:
注意:我假设您正在使用fluent-ffmpeg
store.open(function (err, store) {
if (err) return err; // !! NOTE: This return won't do anything... you should handle the error condition differently !!
res.header("Content-Type", store.metadata['Content Type']);
res.header("Content-Disposition", "attachment; filename='" + store.filename + "'");
ffmpeg() // You shouldn't need "new" here
.input(store.stream(true))
.size('650x365')
.pipe(res);
});
该代码将ffmpeg
的输出直接流式传输到res
,这消除了对临时文件的需求,并简化了相当多的事情。
注意:除了原型或极低流量网站外,我不建议采用此方法。在每个请求上调整图像大小的开销会很大;你应该缓存已调整大小的图像并返回它。