본문 바로가기

Programmer/JAVA

CCTV RTSP 연동 삽질기, MJPEG 부터 go2rtc 적용

처음 맡아본 CCTV RTSP 연동

오늘은 처음으로 CCTV 영상을 웹에서 실시간으로 연동하는 작업을 맡게 됐다.


단순히 영상을 화면에 띄우는 것에서 끝나는 게 아니라,

연동한 영상에서 일정 시간마다 캡처 이미지를 추출하는 기능까지 필요했다.

 

최근에는 모바일 소스 수정에 이어 RTSP 연동까지, 익숙하지 않은 영역의 작업을 계속 맡고 있다.
새로운 걸 배우는 건 의미 있는 일이지만, 한편으로는 점점 내가 감당해야 할 일이 늘어나는 느낌도 든다.

 

모바일 쪽은 예전에 아파치 코르도바(Apache Cordova)를 다뤄본 적이 있어서 그나마 덜 낯설었다.
하지만 RTSP 연동은 이번이 처음이라, 어디서부터 손대야 할지 막막했다.

 

회사에서는 클로드와 RTSP만 있으면 금방 데모가 나올 수 있다고 생각하고 있었다.
겉으로 보기에는 단순히 주소 하나 연결하면 끝날 것처럼 보일 수 있지만, 실제로는 브라우저에서 RTSP를 직접 다루기 어렵고 중간 스트리밍 서버나 변환 구조까지 함께 검토해야 했다.


브라우저에서는 RTSP를 바로 재생하기 어렵다

CCTV 업체에서 받은 연동 문서를 바탕으로 이것저것 찾아보면서 방향을 조금씩 정리할 수 있었다.
먼저 확인한 것은 브라우저에서는 RTSP를 직접 재생하기 어렵다는 점이었다.

 

즉, 카메라가 보내는 RTSP 스트림을 웹에서 바로 띄우는 것이 아니라,
브라우저에서 재생 가능한 형태로 중간 변환해주는 구성이 필요했다.

 

이 부분을 이해하고 나니 왜 단순히 RTSP 주소만 받아서 웹 화면에 붙이면 끝나는 일이 아닌지도 조금 감이 왔다.


처음에는 MJPEG 방식도 검토했다

회사에서는 우선 데모가 가능한 수준으로 빠르게 구현하길 원했다.
그래서 처음에는 MJPEG 방식도 검토했다.

 

MJPEG는 JPEG 이미지를 연속으로 전송해 영상처럼 보이게 하는 방식이라,
구조가 비교적 단순하고 빠르게 테스트하기에는 괜찮아 보였다.

 

처음에는 “일단 데모만 되면 되는 것 아닌가”라는 생각도 들었다.
하지만 조금 더 생각해보니 단순히 빨리 붙이는 것만으로 끝낼 문제는 아닌 것 같았다.


데모보다 더 고민됐던 건 확장성이었다

실제 운영 환경에서는 카메라 한 대만 직접 붙이는 구조보다는,
보통 여러 대의 CCTV가 NVR에 연결되고 그 NVR들을 연동하는 구조가 대다수라고 들었다.

 

그런데 지금 전달받은 것은 카메라 한 대와 연동 문서뿐이었다.
지금 당장은 빠르게 붙이는 것도 중요하지만, 이후 확장성을 생각하면
조금 더 운영 구조를 고려한 방식이 필요해 보였다.

 

결국 “지금 빨리 되는 방식”과 “나중에도 버틸 수 있는 방식” 사이에서 한 번 더 고민하게 됐다.


스트리밍 서버를 비교해봤다

그래서 스트리밍 서버도 함께 검토하게 됐다.
정리해보면 대략 이런 선택지가 있었다.

  • go2rtc: 가볍고 빠르며, RTSP를 WebRTC 등으로 중계하기 무난함
  • MediaMTX: go2rtc와 비슷하지만 기능은 더 많은 편
  • FFmpeg 단독 구성: 직접 변환은 가능하지만 CPU 부하가 큼
  • Wowza: 상용 솔루션으로 안정적이지만 비용 부담이 있음

비교해보니 각각 장단점은 분명했다.
기능이 많은 선택지도 있었고, 안정적인 상용 솔루션도 있었지만
현재 상황에서는 무엇보다 빠르게 적용 가능한지가 중요했다.


go2rtc를 선택한 이유

이번에는 최종적으로 go2rtc를 선택했다.

 

이유는 단순했다.
지금 단계에서 가장 중요한 것은 빠르게 붙여서 데모를 확인하는 것이었기 때문이다.


그 기준에서 go2rtc는 가볍고 빠르게 적용하기 좋은 선택지로 보였다.

MediaMTX처럼 기능이 더 많은 대안도 있었지만,
현재 상황에서는 기능의 폭보다 빠르게 구성하고 바로 확인할 수 있는 점이 더 중요하다고 판단했다.


go2rtc는 어떤 역할을 할까

go2rtc를 찾아보니,
RTSP, RTMP, HTTP 같은 스트림을 받아 WebRTC, MSE 등 브라우저 친화적인 방식으로 변환해 중계해주는 오픈소스 미디어 서버였다.

 

구조를 단순하게 표현하면 이런 형태다.

[카메라 / NVR의 RTSP 스트림] → [go2rtc 서버] → [브라우저(JSP 화면)]

 

즉, 카메라가 보내는 영상을 go2rtc가 받아서 웹에서 다루기 좋은 형태로 바꿔주고,
JSP 화면에서는 그 결과를 받아 출력하는 방식이다.

 

이처럼 중간에 스트리밍 서버를 두는 방식은 브라우저 호환성 문제를 줄여주고,
이후 카메라 수가 늘어날 경우에도 좀 더 안정적으로 확장할 수 있다는 점에서 현실적인 선택처럼 느껴졌다.


간단한 테스트는 일단 성공

go2rtc는 YAML 설정 파일로 스트림 정보를 정의해두고 실행할 수 있어서,
기본 구성을 잡는 데도 생각보다 오래 걸리지 않았다.

 

설정을 맞춘 뒤 간단한 JSP 테스트 페이지를 만들어 확인해보니,
다행히 실제로 영상이 정상적으로 표출되는 것까지는 확인할 수 있었다.

 

처음에는 막막하기만 했던 RTSP 연동이
실제로 화면에 뜨는 것을 보니 그제야 조금 안심이 됐다.


아직 남아 있는 작업

물론 아직은 테스트 단계다.


실서버 반영과 운영 환경 검증이 남아 있고,
처음 요구사항에 있었던 일정 시간마다 캡처 이미지를 추출하는 기능도 추가로 구현해야 한다.

 

그래도 단순히 “보이게만 만드는 것”이 아니라
실제 운영 구조와 확장성까지 고민해본 경험이라는 점에서는 나름 의미가 있었다.

다음에는 캡처 기능까지 붙여서 실제 요구사항에 더 가까운 형태로 완성해봐야겠다.