我正在子进程中运行ffmpeg命令;它将视频文件转换为新格式,将新视频的块发送到stdout,然后用事件处理程序捕获它。
如果我想将视频保存为文件,我可以为该文件创建一个可写流,并将子进程的stdout传递给它,这很好。但现在我想从视频生成屏幕截图,不保存为文件,但要在内存中创建该图像的base64表示,然后将其保存在数据库中。 (我知道一般不建议在数据库中保存图像。)
我现在想知道,建议的方法是,随着时间的推移建立一个价值。
现在,我已经声明了一个数组chunks
。每当我从ffmpeg进程中获取一大块新数据时,我都会对其进行64位编码,然后将其推送到chunks
。当我从流中获得close
事件时,我会在该数组上调用join()
,这就是我的价值。
这很好用,因为我的截图最大为1 MB。但这是一件蠢事吗? Node库中有什么东西,像流,缓冲区或UIntArray这样的结构,是出于这种目的,而不是构建一个数组然后加入它?
答案 0 :(得分:1)
我正在使用Buffers数组,如下所示:
let chunks = [];
stream.on('data', chunk => chunks.push(chunk));
stream.on('end', () => {
let result = Buffer.concat(chunks).toString('base64');
// Do something with result
});
这是最有效的内存方式。没有额外的结构。没有内存重复。