FFMPEG cuelga todo el proceso de nodejs

Lo que estoy tratando de hacer es hacer una miniatura de un video usando ffmpeg. Los datos de video se reciben en una solicitud HTTP y luego se canalizan a ffmpeg. El problema es que una vez que el proceso hijo ffmpeg sale, simplemente no puedo enviar la respuesta.

Aquí está el código:

var http = require('http'), sys = require('sys'), child = require('child_process') http.createServer(function (req, res) { im = child.spawn('ffmpeg',['-i','-','-vcodec','mjpeg','-ss','00:00:03','-vframes','1','-s','100x80','./thumb/thumbnail.jpg']); im.on('exit', function (code, signal) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('{"success":true}\n'); }); req.connection.pipe(im.stdin); }).listen(5678, "127.0.0.1"); 

El problema es que llamando:

 res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('{"success":true}\n'); 

No hace nada, el cliente nunca recibe la respuesta.

Después de dos días de depurar y buscar en Google, parece que encontré el problema. Hay dos errores abiertos relacionados en node.js responsable:

Trataré de describir cuál creo que es el problema con el método ‘pipe’:

El flujo de solicitud no puede invocar el final en ffmpeg.stdin (probablemente error # 777), esto causa un error de tubería rota, pero node.js no maneja el error debido al error # 782, mientras que el flujo de solicitud permanece en pausa, esto bloquea Cualquier respuesta de ser enviado.

El truco / solución alternativa es reanudar la secuencia de solicitud una vez que ffmpeg sale.

Aquí está el ejemplo de código fijo:

 var http = require('http'), sys = require('sys'), child = require('child_process') http.createServer(function (req, res) { im = child.spawn('ffmpeg',['-i','-','-vcodec','mjpeg','-ss','00:00:03','-vframes','1','-s','100x80','./thumb/thumbnail.jpg']); im.on('exit', function (code, signal) { req.resume(); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('{"success":true}\n'); }); req.connection.pipe(im.stdin); }).listen(5678, "127.0.0.1"); 

Tenga en cuenta que esto es un problema / solución alternativa y puede dar lugar a problemas con las futuras versiones de node.js una vez que hagan algo por esos errores.

Probaría algo como esto.

 var http = require('http'): var sys = require('sys'): var child = require('child_process'): http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); im = child.spawn('ffmpeg',['-i','-','-vcodec','mjpeg','-ss','00:00:03','-vframes','1','-s','100x80','./thumb/thumbnail.jpg']); im.on('exit', function (code, signal) { res.end('{"success":true}\n'); }); req.connection.pipe(im.stdin); }).listen(5678, "127.0.0.1"); 

Está intentando canalizar los datos al socket antes de enviar el encabezado.