在同一子进程中同时使用 stdin 和 stdout

Use both stdio and stout in the same child process

我正在使用 ffmpeg 组合 audio/video 2 个流并将它们通过管道进行表达。这是我的代码:

var ffmpeg = cp.spawn('ffmpeg', [
        // Set inputs
        '-i', 'pipe:4',
        '-i', 'pipe:5',
        // Map audio & video from streams
        '-map', '0:v',
        '-map', '1:a',
        // Keep encoding
        '-c', 'copy',
        '-movflags', 'frag_keyframe+empty_moov',
        '-f', 'mp4',
        // Define output file
        'pipe:1',
      ], {
        stdio: [
          /* Standard: stdin, stdout, stderr */
          'inherit', 'inherit', 'inherit',
          /* Custom: pipe:3, pipe:4, pipe:5 */
          'pipe', 'pipe', 'pipe',
        ],
      });
      video.pipe(ffmpeg.stdio[4]);
      audio.pipe(ffmpeg.stdio[5]);
      res.header('Content-Disposition', 'attachment; filename="video.mp4"');
      ffmpeg.stdout.pipe(res);

但是代码给出了一个错误,指出 ffmpeg.stout 为空。经过一些研究,我发现您不能拥有 stdio 选项数组,否则 stout 将为空。有什么办法可以解决这个问题?

差不多两周后,我找到了答案。当我查看文档时,它说:

If the child was not spawned with stdio[1] set to 'pipe', then this will not be set.

我意识到我所要做的就是将中间的 inherit 更改为 pipe:

        stdio: [
          /* Standard: stdin, stdout, stderr */
          'inherit', 'pipe', 'inherit',
          /* Custom: pipe:3, pipe:4, pipe:5 */
          'pipe', 'pipe', 'pipe',
        ],

还是谢谢你。