流畅的ffmpeg性能-在网络驱动器上拍摄大量文件的屏幕截图



我正在尝试扫描特定文件夹中的所有视频,并为每个视频创建缩略图。

以下是相关代码:

public async scan(): Promise<string[]> {
const files = await this.readFile(this._directoryPath);
const result: string[] = [];
for await (const file of files) {
result.push(file);
try {
ffmpeg(file)
.on("error", (err, stdout, stderr) => {
console.log(err.message);
})
.screenshots({
timestamps: [5],
filename: basename(file) + ".png",
folder: this._thumbnailPath,
});
} catch (e: any) {
logger.error("Failed taking screenshot for " + file + " with error " + e.message);
}
}
return result;
}

对于少量视频,它运行良好,但当我尝试使用包含2000个视频文件的网络路径(\\Servername\some_folder(时,我的电脑很快就坏了。它成功地扫描了大约800个视频,然后一切都崩溃了。

有没有办法让它成为一个背景过程?我不需要等它结束。或者,是否可以从一个API调用中逐个块地运行这个块?

我是node.js的新手,所以我们非常感谢您的帮助。

您的问题似乎是代码试图同时并行处理所有输入文件。因此,您会遇到资源分配问题。

从wait的用法来看,我认为您正试图处理这种情况。但问题是ffmpeg(..(.on(…(.screenshots(..(代码序列会立即返回,而无需等待首先创建屏幕截图。所以,等待并没有按照你想要的方式工作。

因此,您需要等待每个视频文件完成,然后转到下一个文件。

一个解决方案是将缩略图生成放在一个承诺中:

async function processFile(file) {
return new Promise((resolve, reject) => {
ffmpeg(file)
.screenshots(...YOUR_OPTIONS_HERE...)
.on("error", ...USE_REJECT_HERE.....)
.on("end", function() {
resolve(file);
});
})
}

然后,不做:

result.push(file)
try {
ffmpeg(file)....

做一些类似的事情:

try {
result.push(await processFile(file));

最新更新