소개
•
이상 감지 알림을 수신하면 감지된 이미지와 해당 CCTV 및 주변 CCTV를 실시간으로 스트리밍하는 서비스입니다.
•
윈도우 모니터링 앱과 윈도우 & 안드로이드 알림 앱으로 구성되었습니다.
사용 기술
Monitoring (Windows App)
•
C++, Qt, OpenCV
Noti App (Android App & Windows App)
•
C++, Qt, Kotlin
진행 업무
[Monitoring] - 영상 스트리밍 성능 개선
•
4K CCTV 영상을 스트리밍하는 컴포넌트의 성능이 약 5프레임이었습니다.
•
OpenCV로 프레임을 가져오는 로직과 화면에 표출하는 로직 모두 하나의 메인 스레드에서 작업하여 발생한 문제였습니다.
◦
OpenCV 로직을 가진 클래스와 화면 표출용 컴포넌트 클래스로 분리하고, 서로를 별도의 스레드로 분리했습니다.
◦
컴포넌트가 화면에서 구성될 때 최대 720p 크기로 구성되기 때문에 프레임을 4K→ 720p로 다운사이징했습니다.
◦
프레임 저장 변수를 스레드 세이프하게 다루기 위해 Mutex를 적용했습니다.
◦
스트리밍 성능이 27~28프레임 정도로 5배가량 개선되었습니다.
[Monitoring] - UI 리팩토링
•
Qt-UI & C++ 방식으로 개발했었으나 유지보수가 까다로워서 요구사항 반영이 힘들었습니다.
•
레이아웃 구성을 제외하면 화면 애니메이션, 동적 스타일 변경 등을 모두 C++로 구현해야 하는 방식이라 생산성이 매우 떨어집니다.
◦
불필요하게 화면 구성에 쓰인 C++ 코드를 QML로 대체하고, 성능이 필요한 로직은 C++로 개발하여 리팩토링을 진행하였습니다.
◦
QML은 선언형 UI로, 이후 추가된 해상도별 반응형 구성도 빠르게 대응할 수 있었고, 코드 가독성을 올림으로써 불필요한 소통을 줄이고 전체적인 개발 능률이 올라갔습니다.
[Noti App] - 크로스 플랫폼 대응
•
이후 진행하게 될 과업 중 알림을 안드로이드뿐만 아니라 다양한 플랫폼에서 수신할 수 있어야 한다는 요구사항이 있었습니다.
•
사내 개발자 대부분의 메인 기술 스택이 C++이었고, 다른 개발자분들의 일정이 특정 플랫폼에 특화된 기술 스택을 새로 배우기는 어려운 환경이었습니다.
◦
안드로이드, 윈도우에서 구동될 수 있도록 Qt와 C++로 코드를 구성하였습니다.
◦
멀티 플랫폼 대응을 위해서 FCM 네이티브 코드를 C++ 모듈로 래핑하였습니다.
◦
이로써 담당 개발자에 관계없이 코드 유지보수가 가능하게 되었습니다.
[Noti App] - 알림 미수신 이슈 대응
•
모바일 앱에서 FCM 알림을 수신하지 못하는 이슈가 발생했습니다.
•
이상 감지 알림 생성이 너무 자주 발생하여 rate limit 이후 알림이 수신되지 않는 것이 원인이었습니다.
◦
초기에는 단순히 알림이 오지 않는다는 내용으로 이슈가 들어와서 어떤 문제인지 파악이 되지 않았으나, 여러 조건으로 테스트해 본 결과, 서버에서 publish하는 알림 큐는 5분 이내에 25개로 알림 개수에 제한이 걸려있었고, 앱에서는 상단 바에 쌓인 알림이 20개일 경우 추가 알림이 수신되지 않는 이슈가 있음을 알게 되었습니다.
◦
서버에서 알림 큐 제한을 전부 채우지 않고, 중복된 내용의 알림은 보내지 않는 등의 최적화 로직을 구현했습니다.
회고
•
VLC 라이브러리로 스트리밍 컴포넌트를 구성했을 때 GPU로 연산하기에 더 좋은 더포먼스가 나왔었습니다.
◦
4K CCTV 스트리밍 컴포넌트를 GPU에서 연산할 수 있도록 리펙토링하면 좋을 것 같습니다.
•
스트리밍 프레임을 화면 표출용 컴포넌트에 전달하는 방식을 Mutex가 적용한 변수에 접근하는 것 대신 Event로 전달하는 리펙토링을 진행하면 더 나은 성능이 나올 것 같아 아쉽습니다.