我需要能够从我的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的子进程运行时无法识别我的音频输入设备?
任何提示都将非常受欢迎。
答案 0 :(得分:11)
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本身将获得没有他无法处理的引号的参数