저번 글에서 오류 메세지를 판별하여 스트림을 재시작 하도록 해주었는데
이것 말고도 더 좋은 방법들이 없을까 고민하고 있었는데
이사님이 재밌는 글을 발견하셨다
https://devshoveling.tistory.com/entry/npm-node-rtsp-stream%EC%B5%9C%EC%A2%85-%EB%B2%84%EC%A0%84
간단하게 요약하자면
각 stream 마다 stderr을 체크하면서 값이 새로 들어오면 스트림이 살아 있는 것이고
값이 들어오지 않는다면 문제가 생긴 것이므로 그 간격이 5초 이상 차이가 나면 스트림 정지 및 재시작 시키는 것이었다.
편법이기는 하지만 보험용으로 걸어두는 것도 나쁘지 않은 것 같아 가져왔다.
const createStream = (cInfo: CInfo, streamObjects: StreamObject[]): StreamObject => {
try {
let streamUrl = '';
if (cInfo.profileNum) {
streamUrl = `rtsp://${cInfo.username}:${cInfo.password}@${cInfo.hostname}/profile${cInfo.profileNum}/media.smp`;
} else {
streamUrl = `rtsp://${cInfo.username}:${cInfo.password}@${cInfo.hostname}`;
}
const stream = new Stream({
streamObjects: streamObjects,
cameraId: cInfo.cameraId,
name: cInfo.cName,
streamUrl: streamUrl,
wsPort: cInfo.wsPort,
ffmpegOptions: cInfo.ffmpegOptions,
});
const videoStream = stream;
const streamRestartTimer = setInterval(() => {
let today = new Date();
if (videoStream.lastDate !== undefined) {
let stream_date = new Date(videoStream.lastDate);
let gap = (today.getTime() - stream_date.getTime()) / 1000;
if (videoStream.streamErrorCount >= 100) {
console.log(
'카운트 100 이상 문제지속 서버에 보고 필요, 현재 카운트 : ',
videoStream.streamErrorCount,
);
}
if (gap >= 5) {
videoStream.stream.kill();
console.log('리스타트 타이머에서 재시작 요청');
videoStream.lastDate = today;
videoStream.restartStream();
videoStream.streamErrorCount++;
}
}
}, 1000);
return { cameraId: cInfo.cameraId, stream: stream, streamRestartTimer: streamRestartTimer };
} catch (err) {
console.log('createStream err:', err);
}
};
리스타트 타이머를 생성해, 스트림에 문제가 있으면 재시작 하도록 구현하였다.
놀랍게도 현재 한달 정도 안정성 테스트 기간 중 한번도 영상이 꺼지지 않았다!! (카메라 자체가 꺼진 경우 제외)