현재 node.js 환경에서 여러대의 ip-camera 실시간 영상을 rtsp을 이용하여 받아와서 ffmpeg를 사용하여 변환하여 웹 소켓을 통해 전달하고 있다.
// ps -ef | grep ffmpeg
이런식으로 프로세스를 차지하고 있다.
모든 카메라의 영상을 변화해 주고 있는데
현재 아무도 보고 있지 않은 카메라에 대한 영상도 계속 변환 하고 있는 것이다.
아무도 카메라를 보고 있지 않다면,
잠시 종료해 두는 것도 괜찮지 않을까? 라는 생각을 하였다.
프론트엔드로 부터 영상을 보기 위한 요청이 들어오면 그 때 다시 생성하면 될 것이었다.
이것을 구현하기 위해 나는 소켓을 이용하기로 하였다.
소켓 접속이 아무도 없다면 이 스트림을 이용중인 사람이 없다는 것을 의미하므로,
그 때 종료 시키고 이것을 중앙 서버에 보고하는 형태로 구현하였다.
시나리오
1. 스트림이 생성되고 웹 소켓 서버가 생성되면 타이머가 작동한다.
2. 이 타이머는 지정된 시간동안 클라이언트 소켓 접속이 하나도 없다면 스트림을 종료하고 서버에 보고한다.
3. 만약 클라이언트 소켓 접속이 일어나면 타이머는 삭제한다.
4. 사용자가 소켓 disconnect가 일어날 때 소켓연결이 하나도 없다면 타이머를 다시 가동한다.
// 서버 생성 시 + 소켓 disconnect 시에 소켓이 하나도 없다면
this.timer = setTimeout(() => {
if (this.wsServer.clients.size === 0) {
console.log('장기간 시청중인 사용자가 없으므로 스트림을 종료합니다.');
removeStreamObjectByCameraId(this.cameraId, this.streamObjects);
this.stop();
reportCameraStatusToCMS(
'LSS',
'STREAM',
this.cameraId,
'NS',
null,
null,
'장기간 시청중인 사용자가 없으므로 스트림을 종료합니다.',
);
}
}, ETIME);
// onSocketConnect 시
if (this.timer) {
console.log('스트림 접속이 있어 종료 예약 타이머를 제거 합니다.');
clearTimeout(this.timer);
}
테스트 결과 잘 작동하여 장기간 미시청 스트림을 정지시키는 것을 확인하였다.
안녕하세요. 유익한 글 잘 보았습니다.
rtsp streaming에 대해 공부 중에 궁금한 점이 생겨 댓글 남깁니다.
아무도 시청하지 않으면 스트림을 정지시킬 때 타이머를 이용해서 구현하는 이유가 있을까요??
그냥 웹소켓이 연결될 때 프로세스를 실행시키고, 웹소켓이 끊길 때 프로세스를 종료하는 방식이랑 어떤 차이가 있을까요?
rtsp url을 보면 h.264 인 것 같은데, cpu 리소스를 써가면서 mpeg1 으로 낮추어서 트랜스코딩 하는 이유가 따로 있나요??