我们的想法是使用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',...)
,但无法成功。
我的环境:节点v0.10.22,OSX Mavericks 10.9。
更新
我用try-catch包裹了spawn('ffmpeg',...
块:
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);
}
....
});
...并且此错误消失了,但是日志是静默的,它没有捕获任何错误。怎么了?
答案 0 :(得分:0)
EPIPE:在管道,套接字或FIFO上的写操作,没有进程可以读取数据
尝试添加错误处理程序,然后将.on('error',function(e){...})放在对.pipe()的调用之前,或者将程序更改为在关闭管道的情况下成功退出
尝试:
object-fit