【问题标题】:Nodejs: Running process before another process is doneNodejs:在另一个进程完成之前运行进程
【发布时间】:2016-08-04 01:03:37
【问题描述】:

我已经在节点程序中运行了这个进程

recorder = spawn("avconv", ["-y", "-r", "30", "-g", "300",
                "-f", "x11grab",
                "-s", "1024x768",
                "-i", process.env.DISPLAY,
                "-vcodec", "qtrle", "my_videos/the_video.mov"]);

此代码使用avconv 程序录制视频。问题在于,在完成录制视频之后,我需要运行另一个将输出文件用于第一个进程的进程

spawn("avconv", ["-y", 
            "-i","my_videos/the_video.mov",
            "-filter:v", "'setpts=5.0*PTS'",
            "my_videos/slowed_video.mov"]);

有没有办法为第一个进程创建一个到第二个进程的管道?

【问题讨论】:

  • 您是否尝试过 spawnSync 而不是 spawn?
  • 这是不可能的,因为第一个过程记录了我的测试套件,当测试套件完成后,这个过程就完成了,然后我需要运行第二个过程。

标签: node.js asynchronous process pipe


【解决方案1】:

基于spawn API 文档。

见:https://nodejs.org/api/child_process.html#child_process_class_childprocess

您应该能够使用on api 监听进程close 事件。

例子:

var AVCONV_OK = 0; // assuming 0 indicates SUCCESS, which what most executable reports.

recorder = spawn("avconv", ["-y", "-r", "30", "-g", "300",
                "-f", "x11grab",
                "-s", "1024x768",
                "-i", process.env.DISPLAY,
                "-vcodec", "qtrle", "my_videos/the_video.mov"]);

recorder.on('close', (returnCode) => { 
    if (returnCode === AVCONV_OK) {
        // Spawn the 2nd process to do step 2.
    }
    else {
        console.log("oops recording failed.");
    }
});

注意:上面的代码是纯伪代码,因为我没有使用avconv,所以无法测试。

或者,您可以像其他评论中建议的那样做。使用spawnSync,它会返回一个包含status 和output 等参数的对象。

无论哪种方式都可以,执行异步的唯一好处是您的 nodeJS 应用程序在您等待 avconv 完成运行时仍然可以处理其他内容。

对于spawnSync,请参阅: https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2019-08-13
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多