我需要能够从我的Node.js应用程序中执行FFMPEG。我相信这个问题可能与正确地指定命令行参数有关,而不是特定于FFMPEG,但是由于我无法缩小问题的范围,我提出了我的整个问题。
我可以从命令提示符成功地执行以下命令
C:\Brad\ffmpeg.exe -f dshow -i audio="Microphone (SoundMAX Integrated" testaaa.mp3FFMPEG按预期启动,从我的音频设备记录音频,并写入一个MP3文件。现在,我尝试在我的应用程序中执行相同的操作。
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?时不识别我的音频输入设备的任何想法。
任何提示都将不胜感激。
发布于 2012-09-07 07:40:51
布兰登在正确的轨道上。当您在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 (至少在XP SP3中是如此)不会去掉单引号或使用它们进行分组,不像在Linux系统上常用的bash那样。因此,如果您查看某人的bash命令行示例,并且它使用单引号,则通常需要用双引号替换它们,这样它才能在Windows下工作。
https://stackoverflow.com/questions/12310468
复制相似问题