Программа запущена с child_process.spawn перестает работать через некоторое время, но child_process.exe c работает - PullRequest
0 голосов
/ 27 марта 2020

Следующая команда кодирует входное видео и выводит out.mkv.

var default_settings = { "width":1920, "height":1080 };
var settings = Object.assign({}, default_settings);

var encoding_args = ["--of=mpegts", "--ovc=libx264", `--ovcopts=profile=main,preset=veryfast,level=4,crf=20,maxrate=5000k`, `--vf=lavfi=[format=yuv420p,yadif=mode=1:deint=1,scale=(iw*sar)*min(${settings.width}/(iw*sar)\\,${settings.height}/ih):ih*min(${settings.width}/(iw*sar)\\,${settings.height}/ih),pad=${settings.width}:${settings.height}:(${settings.width}-iw*min(${settings.width}/iw\\,${settings.height}/ih))/2:(${settings.height}-ih*min(${settings.width}/iw\\,${settings.height}/ih))/2]`, `--oac=aac`, `--oacopts=ac=2,b=160k`];
var mpv_args = ["input-video.mkv", "-v", '--no-config', '--log-file=mpv.log', ...encoding_args, "--o=out.mkv"];

console.log("mpv "+mpv_args.join(" "));
var mpv = child_process.spawn("mpv", mpv_args);

В командной строке, та же команда, она отлично работает. Если я объединяю аргументы в строку и использую child_process.exe c, это работает отлично. Если я использую child_process.spawn, он работает около 5 секунд ... и затем кодирование приостанавливается. Нет cra sh, нет выхода, только паузы.

Попытка с использованием узла 10, 12 + 13 (Windows 10 64 бит). Проблема присутствует во всех. Это какая-то проблема ограничения буфера? Как мне обойти это, все еще используя spawn?

1 Ответ

0 голосов
/ 03 апреля 2020

Похоже, что буфер mpv заполняется. Попробуйте прочитать из буфера, хотя вы ничего не делаете с ним.

 const mpv = spawn('mpv',[/*arg1,arg2,.. */])

   mpv.stdout.on('data', (data) => {
      // read from buffer
    });

    mpv.stderr.on('data', (data) => {
      // console.error(`this.mpvProcess stderr: ${data}`);
    });
    mpv.on('error', (err) => {
      console.error('Failed to start child process.', err);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...