выполнять выполнение функции с многоядерностью на nodejs - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь преобразовать папку с видео, но это занимает слишком много времени. Этот код конвертирует одно за другим видео. Я хочу конвертировать эти видео параллельно, не блокируя компьютер и сокращая время конвертации. Текущий код:

const exec = require('child_process').exec;
const glob = require('glob');
const fs = require('fs');


const STORAGE_PATH = './converted';
const PATH_TO_VIDEOS='./video';
const videos = glob.sync(`${PATH_TO_VIDEOS}/*.mp4`); //videos is an array of paths for each video on some folder

async function createDir(dir) {
 if (dir && !fs.existsSync(dir)) {
   await fs.mkdirSync(dir, {
     recursive: true,
   });
 }
}
async function convertVideos() {
 const starttime = new Date();
 await new Promise(async (resolve) => {

   console.log('>>>Starting conversion of', videos.length, 'files!!!');

   createDir(STORAGE_PATH);
   for (let i = 0; i < videos.length; i++) {

     let video = videos[i];

     var command = `ffmpeg -i ${video} -c:v libx264 -vf scale=1920:1080 -r 60 -c:a aac -ar 48000 -b:a 160k -strict experimental -f mp4 ${STORAGE_PATH}/${i}.mp4`;

     await new Promise((resolve) => {
       exec(command, (error, stdout, stderr) => {
         if (error) {
           console.warn(error);
         }
         resolve(stdout ? stdout : stderr);
         console.log('Video converted');
       });
     });
   }
   resolve();
 }).then(async () => await console.log('Conversion finished!!!', '\n Time of convertion', new Date() - starttime))
}

convertVideos();

Не могли бы вы помочь?

1 Ответ

2 голосов
/ 28 мая 2020

Что вы можете сделать, так это параллельно обработать видео-преобразования, используя Promise.all(). Примерно так:

async function createDir(dir) {
    if (dir && !fs.existsSync(dir)) {
        await fs.promises.mkdir(dir, {
            recursive: true,
        });
    }
}

async function convertVideos() {

    return new Promise((resolve) => {
        console.log('>>>Starting conversion of', videos.length, 'files!!!');

        await createDir(STORAGE_PATH);
        const conversionPromises = [];
        for (let i = 0; i < videos.length; i++) {

            const video = videos[i];

            const command = `ffmpeg -i ${video} -c:v libx264 -vf scale=1920:1080 -r 60 -c:a aac -ar 48000 -b:a 160k -strict experimental -f mp4 ${STORAGE_PATH}/${i}.mp4`;

            conversionPromises.push(new Promise((resolve) => {
                    exec(command, (error, stdout, stderr) => {
                        if (error) {
                            console.warn(error);
                        }
                        resolve(stdout ? stdout : stderr);
                        console.log('Video converted');
                    });
                }));
        }
        await Promise.all(conversionPromises);
        resolve();
    }));

}

(async () => {
    const starttime = new Date();
    await convertVideos();
    console.log('Conversion finished!!!', '\n Time of convertion', new Date() - starttime)
})();
...