带有Args的Node.js子进程问题 - 引用问题?,FFMPEG问题?

时间:2012-09-07 01:08:31

标签: node.js command-line process ffmpeg command-line-arguments

我需要能够从我的Node.js应用程序执行FFMPEG。我相信这个问题可能与正确指定命令行参数有关,而不是特定于FFMPEG,但由于我无法缩小问题范围,我提出了我的整个问题。

我可以从命令提示符 执行以下命令

C:\Brad\ffmpeg.exe -f dshow -i audio="Microphone (SoundMAX Integrated" testaaa.mp3

FFMPEG按预期启动,从我的音频设备录制音频,并写入MP3文件。现在,我尝试在Node.js应用程序中执行相同的操作

childProcess = child_process.spawn('C:\\Brad\\ffmpeg.exe', ['-f', 'dshow', '-i', 'audio="Microphone (SoundMAX Integrated"', 'testaaa.mp3']);
childProcess.stderr.on('data', function (data) {
    console.log('StdioSource received data from STDERR: ' + data);
});

从Node.js中,FFMPEG失败!错误很简单:

[dshow @ 0000000001eded80] Could not find audio device.
audio="Microphone (SoundMAX Integrated": Input/output error

认为可能由于某种原因这是一个奇怪的权限错误,我决定在我的Node应用程序中使用-list_devices true运行FFMPEG,果然,列出了相关设备:

[dshow @ 000000000228ecc0] DirectShow video devices
[dshow @ 000000000228ecc0] Could not enumerate video devices.
[dshow @ 000000000228ecc0] DirectShow audio devices
[dshow @ 000000000228ecc0]  "Microphone (SoundMAX Integrated"

有什么想法为什么我无法在FFMPEG的参数中正确指定音频输入设备,或者为什么FFMPEG在作为Node.js的子进程运行时无法识别我的音频输入设备?

任何提示都将非常受欢迎。

2 个答案:

答案 0 :(得分:11)

布兰登走在正确的轨道上。当您在Windows命令行上的参数周围使用双引号时,shell会将其删除,程序会将其视为未引用。当你使用child_process.spawn()时,你绕过shell,结果程序看到字面引号作为参数的一部分,并且不准备处理它们。

例如,我创建了一个小节点脚本pargs.js,仅由console.log(process.argv);组成。使用与FFMPEG相同的参数运行它,我得到:

C:\Documents and Settings\Eric Bohlman>node pargs -f dshow -i audio="Microphone(SoundMAX Integrated" testaaa.mp3
[ 'node',
  'C:\\Documents and Settings\\Eric Bohlman\\pargs',
  '-f',
  'dshow',
  '-i',
  'audio=Microphone (SoundMAX Integrated',
  'testaaa.mp3' ]

C:\Documents and Settings\Eric Bohlman>

正如您所看到的,shell在使用它们之后剥离了引号,以避免在空格处破坏audio=...参数。

请注意,Windows shell(至少从XP SP3开始)不会剥离单引号或使用它们进行分组,这与Linux系统中常用的bash不同。因此,如果您正在查看某人的示例bash命令行并使用单引号,则通常必须使用双引号替换它才能在Windows下工作。

答案 1 :(得分:1)

正如ebolhman生动地解释的那样,默认情况下,spawn函数不会创建一个shell来执行命令,因此如果你仍然想要使用spawn \ spawnSync,那么引号不会被剥离,你只需要做to是以下列方式传递参数

require('child_process').spawn('ExePathHere', arrOfArguments, { shell: true });

Exe本身将获得没有他无法处理的引号的参数