ffmpeg - функция завершения, вероятно, не работает правильно? - PullRequest
0 голосов
/ 19 января 2020

получил этот код для l oop через некоторые файлы .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 (конец) иногда не работает, ошибка: ENOENT: такого файла или каталога нет, переименуйте

Я думаю, это потому, что процесс сохранения tn.png медленнее, чем переименование ...

1 Ответ

1 голос
/ 19 января 2020

Я бы не смешивал обратный вызов, syn c, sleep и l oop togather. Вы можете использовать fs версию обещания, чтобы преобразовать весь ваш стиль обратного вызова в стиль обещания. Вы можете сделать это последовательно или параллельно.

Кроме того, я бы сказал, преобразуйте код скриншота в оболочку в обещании.

вот код

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")}`);
    }
  }));
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...