¿Node.js problema de proceso hijo con Args – Quotes Issue ?, ¿FFMPEG problema?

Necesito poder ejecutar FFMPEG desde mi aplicación Node.js. Creo que este problema probablemente tenga que ver con la especificación correcta de los argumentos de la línea de comandos, y no es específico de FFMPEG, pero como no he podido reducir el problema, presento todo el problema.

Puedo ejecutar el siguiente comando desde el símbolo del sistema con éxito :

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

FFMPEG se inicia como se esperaba, graba el audio de mi dispositivo de audio y escribe un archivo MP3. Ahora, trato de hacer lo mismo dentro de mi aplicación 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); }); 

Desde dentro de Node.js, FFMPEG falla! El error es simplemente:

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

Pensando que quizás por alguna razón este fue un error de permisos extraño, decidí ejecutar FFMPEG con -list_devices true desde dentro de mi aplicación Node, y lo suficientemente seguro, el dispositivo en cuestión está en la lista:

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

¿Alguna idea de por qué no puedo especificar correctamente el dispositivo de entrada de audio en los argumentos de FFMPEG, o por qué FFMPEG no reconoce mi dispositivo de entrada de audio cuando se ejecuta como un proceso secundario en Node.js?

Cualquier consejo sería muy apreciado.

Brandon está en el camino correcto. Cuando usa comillas dobles alrededor de los argumentos en la línea de comando de Windows, el shell los elimina y el progtwig los ve sin comillas. Cuando usas child_process.spawn() , estás evitando el shell, y como resultado, el progtwig ve comillas literales como parte del argumento y no está preparado para lidiar con ellas.

Por ejemplo, creé un script de nodo pequeño, pargs.js , que consiste solo en console.log(process.argv); Ejecutándolo con los mismos argumentos que le diste a FFMPEG, obtengo:

 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> 

Como puede ver, el shell eliminó las comillas después de usarlas para evitar romper el argumento audio=... en los espacios.

Tenga en cuenta que el shell de Windows (al menos a partir de XP SP3) no elimina las comillas simples ni las utiliza para agrupar, a diferencia de, por ejemplo, bash como se usa comúnmente en los sistemas Linux. Por lo tanto, si observa la línea de comandos de bash de ejemplo de alguien y utiliza comillas simples, generalmente tendrá que reemplazarlos por comillas dobles para que funcione bajo Windows.

Como explicó vívidamente ebolhman , de forma predeterminada, la función spawn no crea un shell para ejecutar el comando, por lo tanto, las comillas no se eliminan, si aún desea usar spawn \ spawnSync, todo lo que tiene que hacer es pasarle los argumentos. la siguiente manera

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

El propio Exe obtendrá los argumentos sin las citas que no puede manejar.

    Intereting Posts