如何从mongo gridfs调整图像流的大小

时间:2014-09-12 20:24:56

标签: node.js mongodb ffmpeg gridfs

我还是节点的新手,所以请耐心等待。

我有存储在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:处理输入时找到无效数据。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

GridStore完成运行之前,您已将res流传输到ffmpeg,这可能会导致各种不可预测的结果。此外,您管道res的流来自GridStore,而不是ffmpeg的输出。因此,即使ffmpeg确实正确运行,您也不会获得原始图片,而不是调整后的图片。

自从我使用GridStoreffmpeg以来已经有一段时间了,所以我生气了,但我快速浏览了一下这些文档,我认为你想要这样的东西:

注意:我假设您正在使用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,这消除了对临时文件的需求,并简化了相当多的事情。

注意:除了原型或极低流量网站外,我不建议采用此方法。在每个请求上调整图像大小的开销会很大;你应该缓存已调整大小的图像并返回它。