gpt4 book ai didi

node.js - 管道: write EPIPE in Node. js中未处理的流错误

转载 作者:行者123 更新时间:2023-12-03 12:13:17 26 4
gpt4 key购买 nike

这个想法是使用 Express.js 服务器提供 RTSP 视频流的屏幕截图。在流动模式下有一个持续运行的衍生 openRTSP 进程(它的 stdout 被另一个 ffmpeg 进程消耗):

function spawnProcesses (camera) {
var openRTSP = spawn('openRTSP', ['-c', '-v', '-t', camera.rtsp_url]),
encoder = spawn('ffmpeg', ['-i', 'pipe:', '-an', '-vcodec', 'libvpx', '-r', 10, '-f', 'webm', 'pipe:1']);

openRTSP.stdout.pipe(encoder.stdin);

openRTSP.on('close', function (code) {
if (code !== 0) {
console.log('Encoder process exited with code ' + code);
}
});

encoder.on('close', function (code) {
if (code !== 0) {
console.log('Encoder process exited with code ' + code);
}
});

return { rtsp: openRTSP, encoder: encoder };
}

...

camera.proc = spawnProcesses(camera);

有一个单一路由的 Express 服务器:
app.get('/cameras/:id.jpg', function(req, res){
var camera = _.find(cameras, {id: parseInt(req.params.id, 10)});
if (camera) {
res.set({'Content-Type': 'image/jpeg'});
var ffmpeg = spawn('ffmpeg', ['-i', 'pipe:', '-an', '-vframes', '1', '-s', '800x600', '-f', 'image2', 'pipe:1']);
camera.proc.rtsp.stdout.pipe(ffmpeg.stdin);
ffmpeg.stdout.pipe(res);
} else {
res.status(404).send('Not found');
}
});

app.listen(3333);

当我请求 http://localhost:3333/cameras/1.jpg我得到了想要的图像,但有时应用程序会因错误而中断:
stream.js:94
throw er; // Unhandled stream error in pipe.
^
Error: write EPIPE
at errnoException (net.js:901:11)
at Object.afterWrite (net.js:718:19)

奇怪的是,有时它会成功地将图像流式传输到 res流式传输并关闭子进程而没有任何错误,但有时会流式传输图像并崩溃。

我试图创建 on('error', ...)每个可能的流上的事件处理程序,尝试更改 pipe(...)调用 on('data',...) build ,但未能成功。

我的环境: Node v0.10.22,OSX Mavericks 10.9。

更新:

我包了 spawn('ffmpeg',...用 try-catch 阻止:
app.get('/cameras/:id.jpg', function(req, res){
....
try {
var ffmpeg = spawn('ffmpeg', ['-i', 'pipe:', '-an', '-vframes', '1', '-s', '800x600', '-f', 'image2', 'pipe:1']);
camera.proc.rtsp.stdout.pipe(ffmpeg.stdin);
ffmpeg.stdout.pipe(res);
} catch (e) {
console.log("Gotcha!", e);
}
....
});

...并且此错误消失了,但是日志是静默的,它没有捕获任何错误。怎么了?

最佳答案

EPIPE :在没有进程读取数据的管道、套接字或 FIFO 上写入
尝试添加错误处理程序,然后在调用 .pipe() 之前放置 .on('error', function(e) { ... }) 或在关闭管道的情况下更改程序以成功退出
尝试 :

process.stdout.on('error', function( err ) {
if (err.code == "EPIPE") {
process.exit(0);
}
});

关于node.js - 管道: write EPIPE in Node. js中未处理的流错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230777/

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