Node.js:从jpeg图像到video文件的实时转换

我使用node.js和通过socket.io库我收到实际上是jpeg图像的数据块。 这些图像是从远程摄像头捕获的实时video帧。 我不得不以jpeg帧stream式传输video。 我正在寻找一种方法来在video文件(mpeg 4或mjpeg文件)中即时转换这些jpeg图像。 节点有一个库可以做到这一点? 我已经看了一下Node-fluent-FFMPEG库,但是唯一给出的例子是将jpeg文件转换为video,而不是从jpeg图像stream中进行转换。 或者,ffmpeg for windows支持jpeg图像stream作为input吗?

       

网上收集的解决方案 "Node.js:从jpeg图像到video文件的实时转换"

使用require("child_process")你可以使用ffmpeg,或者可能有npm模块来帮助这个。 ffmpeg将允许您首先获取jpeg列表并将其转换为video,然后您可以将video的开头或结尾添加一个(或一个)jpegs列表。

我想你应该看电视

 var exec = require("child_process").exec; var escape = require("shell-escape"); var debug = require("debug")("videofy"); var mkdirp = require("mkdirp"); var uid = require("uid2"); /* * Expose videofy */ module.exports = videofy; /** * Convert `input` file to `output` video with the given `opts`: * * - `rate` frame rate [10] * - `encoders` the video codec format, default is libx264 * * @param {String} input * @param {String} output * @return * @api public */ function videofy(input, output, opts, fn) { if (!input) throw new Error('input filename required'); if (!output) throw new Error('output filename required'); var FORMAT = '-%05d'; // options if ('function' == typeof opts) { fn = opts; opts = {}; } else { opts = opts || {}; } opts.rate = opts.rate || 10; opts.codec = opts.codec || 'libx264'; // tmpfile(s) var id = uid(10); var dir = 'tmp/' + id; var tmp = dir + '/tmp' + FORMAT + '.jpg'; function gc(err) { debug('remove %s', dir); exec('rm -fr ' + dir); fn(err); } debug('mkdirp -p %s', dir); mkdirp(dir, function(error) { if (error) return fn(error); // convert gif to tmp jpg var cmd = ['convert', input, tmp]; cmd = escape(cmd); debug('exec %s', cmd); // covert jpg collection to video exec(cmd, function(err) { if (err) return gc(err); var cmd = ['ffmpeg']; cmd.push('-f', 'image2'); cmd.push('-r', String(opts.rate)); cmd.push('-i', tmp); cmd.push('-c:v', String(opts.codec)); cmd.push(output); cmd = escape(cmd); debug("exec %s", cmd); exec(cmd, gc); }); }); } 

如文档中所述,FFMPEG支持inputstream。

您可以将任意数量的input添加到Ffmpeg命令。 input可以是可读的stream

所以例如它支持使用

 ffmpeg().input(fs.createReadStream('/path/to/input3.avi')); 

'/path/to/input3.avi'文件创build一个可读stream 。

我对FFMPEG一无所知,但是你可以把你的消息从socket.io(消息可能是一个Buffer )中取出来,然后用你自己的Readablestream实现。