Javascript ffmpeg-on-end函数可能无法正常工作?

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'

让这段代码遍历一些.mp4文件并创建它们的屏幕截图:

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()
)是有意义的。是的,我完全同意你的看法,我将“现在同步”添加到了所有可能的方法->仍然没有成功。