gpt4 book ai didi

node.js - FFMPEG 挂掉整个nodejs进程

转载 作者:搜寻专家 更新时间:2023-10-31 23:02:51 26 4
gpt4 key购买 nike

我想做的是使用 ffmpeg 制作视频的缩略图。视频数据在 HTTP 请求中接收,然后通过管道传输到 ffmpeg。问题是,一旦 ffmpeg 子进程退出,我就无法发回响应。

代码如下:

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");

问题是调用:

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

什么都不做,客户端永远不会收到响应。

最佳答案

经过两天的调试和谷歌搜索,我似乎找到了问题所在。node.js 中有两个相关的开放错误负责:

我将尝试描述我认为“pipe”方法的问题所在:

请求流无法在 ffmpeg.stdin 上调用结束(可能是错误 #777),这会导致管道错误,但由于错误 #782,node.js 不会处理错误,同时请求流保持暂停状态- 这会阻止发送任何响应。

破解/解决方法是在 ffmpeg 退出后恢复请求流。

这是固定的代码示例:

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");

请记住,这是一个黑客/解决方法,一旦他们对这些错误采取措施,可能会导致 future 的 node.js 版本出现问题

关于node.js - FFMPEG 挂掉整个nodejs进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6483553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com