실시간 스트리밍 오류 시 스트리밍 자동 재시작 (2)

냥무룩·2023년 6월 19일
0

rtsp-stream

목록 보기
3/4

저번 글에서 오류 메세지를 판별하여 스트림을 재시작 하도록 해주었는데

이것 말고도 더 좋은 방법들이 없을까 고민하고 있었는데

이사님이 재밌는 글을 발견하셨다

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

리스타트 타이머를 생성해, 스트림에 문제가 있으면 재시작 하도록 구현하였다.

놀랍게도 현재 한달 정도 안정성 테스트 기간 중 한번도 영상이 꺼지지 않았다!! (카메라 자체가 꺼진 경우 제외)

0개의 댓글