Javascript ffmpeg-on-end函数可能无法正常工作?
让这段代码遍历一些.mp4文件并创建它们的屏幕截图:Javascript ffmpeg-on-end函数可能无法正常工作?,javascript,node.js,ffmpeg,Javascript,Node.js,Ffmpeg,让这段代码遍历一些.mp4文件并创建它们的屏幕截图: files.forEach(file => { console.log(file); if(!fs.existsSync('img/' + file.replace('.mp4', '.png'))) { ffmpeg({ source: 'movies/' + file}) .takeScreenshots({ timemarks: [ '50' ], size: '150x100'
files.forEach(file => {
console.log(file);
if(!fs.existsSync('img/' + file.replace('.mp4', '.png'))) {
ffmpeg({ source: 'movies/' + file})
.takeScreenshots({ timemarks: [ '50' ], size: '150x100' }, 'img/', function(err, filenames) {
})
.on('end', function() {
fs.rename('img/tn.png', 'img/' + file.replace('.mp4', '.png'), function(err) {if (err) console.log('Error: ' + err) });
sleep(1000);
})
}
});
现在我遇到了这样的问题。on(end)有时不起作用,错误:
enoint:没有这样的文件或目录,重命名
我认为这是因为保存tn.png的过程比重命名慢…我不会将回调、同步、睡眠和循环混合在一起。您可以使用
fs
promise-version将所有回调样式转换为promise样式。您可以按顺序或并行执行
另外,我要说的是,将屏幕截图代码转换为封装在promise中
这是密码
const fs = require("fs").promises;
function takeScreenshot(file) {
return new Promise((resolve, reject) => {
ffmpeg({"source": `movies/${file}`})
.takeScreenshots({"timemarks": ["50"], "size": "150x100"}, "img/", function (err, filenames) {
})
.on("end", function () {
resolve();
})
.on("error", err => {
reject(err);
});
});
}
// execute one by one
async function sequential(files) {
for (const file of files) {
const fileExists = await fs.stat(`img/${file.replace(".mp4", ".png")}`);
if (fileExists) {
await takeScreenshot(file);
await fs.rename("img/tn.png", `img/${ file.replace(".mp4", ".png")}`);
}
}
}
// execute in parallel
async function parallel(files) {
return Promise.all(files.map(async file => {
const fileExists = await fs.stat(`img/${file.replace(".mp4", ".png")}`);
if (fileExists) {
await takeScreenshot(file);
await fs.rename("img/tn.png", `img/${ file.replace(".mp4", ".png")}`);
}
}));
}
希望这能有所帮助。每当您使用
sleep
尝试管理异步活动时,可能有更好的方法。在某些情况下,使用Sync
变体(如fs.renameSync()
)是有意义的。是的,我完全同意你的看法,我将“现在同步”添加到了所有可能的方法->仍然没有成功。