以child_process.spawn开头的程序在一段时间后停止工作,但是child_process.exec可以工作

问题描述 投票:0回答:1

以下命令对输入视频进行编码并输出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.exec,它会完美地工作。如果我使用child_process.spawn,它可以工作约5秒钟...然后编码会暂停。没有崩溃,没有出口,只是停顿。

[尝试使用节点10、12 + 13(Windows 10 64位)。所有人都存在问题。这是某种缓冲区限制问题吗?在仍然使用spawn的情况下如何解决?

node.js child-process spawn
1个回答
0
投票

看起来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);
    });
© www.soinside.com 2019 - 2024. All rights reserved.