Bra*_*rad 6 command-line ffmpeg process command-line-arguments node.js
我需要能够从我的Node.js应用程序执行FFMPEG.我相信这个问题可能与正确指定命令行参数有关,而不是特定于FFMPEG,但由于我无法缩小问题范围,我提出了我的整个问题.
我可以从命令提示符成功执行以下命令:
C:\Brad\ffmpeg.exe -f dshow -i audio="Microphone (SoundMAX Integrated" testaaa.mp3
Run Code Online (Sandbox Code Playgroud)
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);
});
Run Code Online (Sandbox Code Playgroud)
从Node.js中,FFMPEG失败了! 错误很简单:
[dshow @ 0000000001eded80] Could not find audio device.
audio="Microphone (SoundMAX Integrated": Input/output error
Run Code Online (Sandbox Code Playgroud)
考虑到可能由于某种原因这是一个奇怪的权限错误,我决定-list_devices true在我的Node应用程序中运行FFMPEG ,果然,列出了有问题的设备:
[dshow @ 000000000228ecc0] DirectShow video devices
[dshow @ 000000000228ecc0] Could not enumerate video devices.
[dshow @ 000000000228ecc0] DirectShow audio devices
[dshow @ 000000000228ecc0] "Microphone (SoundMAX Integrated"
Run Code Online (Sandbox Code Playgroud)
有什么想法为什么我不能在FFMPEG的参数中正确指定音频输入设备,或者为什么FFMPEG在作为Node.js的子进程运行时无法识别我的音频输入设备?
任何提示都将是最受欢迎的.
ebo*_*man 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>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,shell在使用它们之后剥离了引号,以避免破坏audio=...空格处的参数.
请注意,Windows shell(至少从XP SP3开始)不会剥离单引号或使用它们进行分组,这与Linux系统中常用的bash不同.因此,如果您正在查看某人的示例bash命令行并且它使用单引号,您通常必须用双引号替换它才能在Windows下工作.