Node.js 如何从多个文件创建可读的文件流

Node.js 如何从多个文件创建可读的文件流,node.js,ffmpeg,fs,Node.js,Ffmpeg,Fs,有关问题: 具有驻留在网络共享上的文件名数组。希望将它们转换为带有nodejs服务器上进程的timelapse视频。我计划使用ffmpeg来实现这一点。FFMPEG不允许文件列表作为输入(据我所知)。但是,它们允许“可读文件流” 是否有一种机制可以从文件名数组创建可读的文件流 他们在fluent ffmpeg示例中使用的命令是:var command=ffmpeg(fs.createReadStream('/path/to/file.avi') 。。。但很明显,这只是一个文件。我认为这是一个值得

有关问题:

具有驻留在网络共享上的文件名数组。希望将它们转换为带有nodejs服务器上进程的timelapse视频。我计划使用ffmpeg来实现这一点。FFMPEG不允许文件列表作为输入(据我所知)。但是,它们允许“可读文件流”

是否有一种机制可以从文件名数组创建可读的文件流

他们在fluent ffmpeg示例中使用的命令是:
var command=ffmpeg(fs.createReadStream('/path/to/file.avi')


。。。但很明显,这只是一个文件。

我认为这是一个值得研究的有趣问题,所以我创建了一个
multiSourceStream
类,它接受一个文件数组,并将一个接一个地对它们进行流式处理。我已经在简单的文本文件(包括一些非常大的文件)上测试过,它似乎可以正确地进行流控制,但可能需要更详细的测试

const {Readable} = require('stream');
const fs = require('fs');

class multiSourceStream extends Readable {
    constructor(files, options) {
        super(options);
        this.files = files.slice();
        this.readyToPush = false;
        this.nextFile();
    }
    nextFile() {
        if (this.files && this.files.length) {
            const rs = this.rs = fs.createReadStream(this.files.shift());
            // don't start flowing data until _read() is called
            if (!this.readyToPush) {
                rs.pause();
            }
            rs.on('data', chunk => {
                if (!this.push(chunk)) {
                    rs.pause();
                    this.readyToPush = false;
                }
            }).on('end', () => {
                this.nextFile();
            }).on('error', err => {
                this.destroy(err);
            });
        } else {
            this.rs = null;
            // all done
            this.push(null);
        }

    }
    _read() {
        this.readyToPush = true;
        if (this.rs) {
            this.rs.resume();
        } else {
            // all done
            this.push(null);
        }
    }
}


// example use
const ms = new multiSourceStream(['temp.txt', 'file1.txt', 'file2.txt']);
ms.pipe(fs.createWriteStream('myoutput.txt'));

当使用此选项时,在倒数第二行中,我使用
constimagestream=newmultisourcestream(fileList)这给了我
未处理的PromisejectionWarning:错误:未知:未知错误,在Object.readSync(fs.js:568:3)在tryReadSync(fs.js:353:20)在Object.readFileSync(fs.js:382:19)读取。
@lowcrawler-您正在运行哪个版本的node.js?我不明白为什么会涉及任何同步文件I/O,所以有些东西看起来可疑,让我认为错误不是来自此代码,而是来自其他东西。仅供参考,此代码在节点v14.4.0中适用。您的代码中的
文件列表是什么?请提供足够的信息,我可能会重现你的问题。创建流之后,您将如何处理它?你能为拒绝提供完整的调用堆栈吗?@lowcrawler-另外,你能自己运行这段代码吗(作为测试),通过同一目录中存在的三个文本文件的文件名吗?我相信我的错误来自fluent ffmpeg。当我可以得到无错误输出
Unknown:Unknown error时,请阅读
我将重新尝试您的代码。您是对的,您的代码中不存在任何可能导致此问题的内容。我们将在一天结束前进行测试。