我正在使用 node.js 并通过 socket.io 库接收到实际上是 jpeg 图像的数据块。这些图像是从远程网络摄像头捕获的实时视频帧。我被迫将视频流式传输为 jpeg 帧。我正在寻找一种将这些 jpeg 图像动态转换为视频文件(mpeg 4 或 mjpeg 文件)的方法。节点是否有可以做到这一点的库?我已经查看了Node-fluent-FFMPEG库,但给出的唯一示例是关于将 jpeg 文件转换为视频,而不是从 jpeg 图像流动态转换。或者,Windows 的 ffmpeg 是否支持 jpeg 图像流作为输入?
问问题
10996 次
3 回答
2
FFMPEG 支持流作为输入,如docs中所述。
您可以向 Ffmpeg 命令添加任意数量的输入。输入可以是 [...] 可读流
因此,例如它支持使用
ffmpeg().input(fs.createReadStream('/path/to/input3.avi'));
它从位于的文件中创建一个可读流'/path/to/input3.avi'
。
我对 FFMPEG 一无所知,但是您可以从 socket.io 中提取消息(消息可能已经是 Buffer),并用您自己的Readable stream实现将其包装起来。
于 2016-01-14T22:30:53.827 回答
1
我认为你应该看看videofy
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);
});
});
}
于 2015-11-03T12:18:43.153 回答
0
使用require("child_process")
你可以使用 ffmpeg,或者可能有 npm 模块来帮助解决这个问题。ffmpeg 将允许您首先获取 jpeg 列表并将其转换为视频,其次您可以将列表(或仅一个)jpeg 添加到视频的开头或结尾。
于 2015-06-10T15:37:59.320 回答