MiBeeNVR: 자체 호스팅 NVR에서 동적 타임랩스와 열화상 카메라 지원
요약
MiBeeNVR은 Go 언어로 작성된 오픈 소스 NVR로, 클라우드 의존성 없이 로컬 네트워크 환경에 최적화되어 있습니다. ONVIF, RTSP 등 다양한 표준 프로토콜을 지원하며, 특히 레거시 장비 등록 문제와 오디오 스트리밍 기능을 개선했습니다. 또한 열화상 카메라를 일급 소스로 처리하여 히트맵 기반의 고급 시각화를 제공하는 것이 특징입니다.
핵심 포인트
- Go 언어 기반의 단일 정적 바이너리로, 로컬 저장 및 웹 인터페이스가 내장되어 있습니다.
- ONVIF, RTSP 등 광범위한 표준 프로토콜을 지원하며 레거시 장비 등록 문제를 개선했습니다.
- v0.14.1부터 오디오 스트리밍(AAC, G.711, Opus)이 공식적으로 지원됩니다.
- 열화상 카메라를 일급 소스로 처리하여 히트맵 및 온도 판독 기능을 제공합니다.
저는 MiBeeNVR을 유지 관리하고 있습니다. 이것은 Go 언어로 작성된 오픈 소스 네트워크 비디오 레코더(NVR)입니다. 외부 종속성 없이 웹 인터페이스가 내장된 단일 정적 바이너리이며, 클라우드 계정이나 원격 측정 기능이 없습니다. 카메라를 연결하면 로컬 저장소에 기록하고 브라우저에서 영상을 확인할 수 있습니다. 이 전체 시스템은 제 컴퓨터에서 약 38MB의 RAM만 사용하며, 512MB의 Raspberry Pi 3B급 보드에서도 실행됩니다. 영상은 사용자가 의도적으로 전송하기 전까지는 네트워크를 벗어나지 않습니다. 본 게시물은 로드맵이 아닌, 현재(v0.14.1) 실제로 작동하는 모든 기능을 설명합니다. 만약 자체 호스팅을 하며 카메라 데이터를 자신의 하드웨어에 보관하는 것에 관심이 있다면 이 부분을 읽어보시길 바랍니다.
지원하는 카메라:
The realistic question for any NVR is "will my cameras connect." MiBeeNVR은 실제로 사용되는 프로토콜들을 지원합니다:
- ONVIF: LAN에서의 자동 검색(auto-discovery), PTZ 제어, 스트림 URI 해석 기능과 플러그 앤 플레이 등록을 제공합니다. 네트워크에 나타나는 카메라는 백그라운드에서 등록됩니다 (Hikvision-NVR 방식): 인증이 필요 없는 카메라는 즉시 녹화를 시작하며, 자격 증명이 필요한 카메라는 사용자가 추가할 때까지 보류 상태로 대기합니다. v0.14.1 릴리스에서는 오래된 펌웨어 카메라가 인증 핸드셰이크(auth handshake)에서 오류를 일으키거나 오래된 서비스 엔드포인트를 보고하는 문제를 수정하여, 다른 소프트웨어로는 등록이 어려웠던 레거시 장비도 깨끗하게 등록할 수 있게 되었습니다.
- RTSP: H.264, H.265 및 MJPEG 소스를 지원하며, v0.14.1부터는 오디오(AAC, G.711, Opus)도 지원합니다.
- HTTP-JPEG: 간단한 스냅샷 피드를 제공합니다.
- Xiaomi 카메라: CS2 P2P와 레거시 TUTK를 커뮤니티 주도로 통합하여 여러 모델을 지원합니다.
- GB/T 28181: 중국 시장의 국가 표준입니다. 실제 하드웨어 검증을 거쳐 v0.14.0에서 프로덕션 지원으로 전환되었으며, 캐스케이드 등록(cascade registration), GB35114 A등급 상호 운용성(interop), 그리고 소스로부터 선택적 B/C 암호화 빌드를 지원합니다.
- WHIP 스트리밍: RTMP 및 SRT 푸시인(push-in)을 통해 외부 스트림을 가져올 수 있습니다.
- SIP 초인종: Doorbird 스타일의 인터콤 출입 기능을 제공하며, 수신 전화 팝업과 통화 기록을 지원합니다.
만약 카메라가 표준 프로토콜을 사용한다면, 제조사별 앱 없이도 거의 확실하게 연결됩니다.
실시간 라이브 뷰(Live view)는 WebRTC (서브초 단위, WHEP 기반), HLS, 그리고 HTTP-FLV를 지원합니다 (v0.14.1 기준 브라우저 내 AAC 오디오 포함). 또한 사용자 지정 빌드를 위해 원시 WebSocket 프레임도 지원합니다. WebRTC는 LAN 환경에서 사용하기에 가장 적합하며, 페이지를 열자마자 클릭을 끝내기도 전에 스트림이 준비됩니다.
열화상 이미징(Thermal imaging): 열화상 카메라는 일급 소스(first-class source)로 지원됩니다. 라이브 뷰에서는 열 채널이 수직 색상 스케일 범례와 화면 온도 판독기(on-screen temperature readouts)가 있는 히트맵(heat-map)으로 표시됩니다. 여기에는 전체 프레임의 최대/최소 범위 밴드와 개별 지점을 읽을 수 있도록 배치하는 스팟 프로브(spot probes, 조준점 마커)가 포함됩니다. 발표된 샷은 GB28181 열화상 장치를 보여주므로, 다른 모든 카메라와 동일한 검색(discovery), 녹화, 타임라인 파이프라인을 통해 흐릅니다. 일반 녹화 및 재생 위에 온도 오버레이를 얻을 수 있습니다.
녹화(Recording): 이 부분에서 시스템은 보급형 하드웨어에서도 제 역할을 합니다: 연속 MP4 세그먼트 녹화, 여러 대의 카메라 동시 지원 및 카메라별 보존 일수 설정이 가능합니다. AI 이벤트 마커가 있는 타임라인, 틈새 없는 세그먼트 전환(gap-free segment switching), 그리고 간극을 가로지르는 하루 전체 VOD 스크러빙이 가능합니다.
오디오 녹화(Audio recording): (AAC / G.711 / Opus)를 지원하며, 네트워크 오디오 픽업도 가능합니다. GB28181 음성 채널 또는 RTSP 오디오 소스는 단순한 카메라 부착물이 아닌 자체 장치로 연결되며, 실시간 모니터링(라이브 파형, ADTS/Ogg/WAV를 통한 제로-디코딩 패스스루)과 동반 녹화 및 독립 캡처 모두에 대한 WAV 내보내기 기능을 제공합니다.
클립 캡처(Clip capture): Windows 및 macOS에서 로컬 디스크로 바로 캡처할 수 있습니다. NAS를 뒤지지 않고 편집이나 녹화를 위해 필요한 부분을 즉시 가져올 수 있습니다.
타임랩스(Timelapse): 영상이 도착함에 따라 클립을 구축하는 동적 캡처(dynamic capture)를 포함하며, 자동/수동 세그먼트 병합 기능을 제공합니다. 주간 녹화 스케줄링(weekly recording schedule): 카메라가 중요하지 않은 시간에 데이터를 기록하지 않도록 시간대별 및 요일별(자정 경계를 넘는 창 포함) 일정을 설정할 수 있습니다.
MJPEG 녹화는 프레임당 하나의 파일로 저장되는 대신 단일 AVI 파일로 저장되어 저전력 보드에서 실제 I/O 병목 현상을 제거했습니다.
다중 스토리지 파티션: 녹화본이 단일 디스크에 종속되지 않습니다. 스토리지는 여러 파티션이나 볼륨에 걸쳐 저장될 수 있으므로, 카메라 수가 증가해도 하나의 볼륨이 가득 차는 것에 의존하지 않습니다.
장치 내에서 유지되는 AI 감지: 객체 탐지는 Web Worker 내부의 ONNX Runtime Web + WebGPU를 통해 브라우저에서 완전히 실행됩니다. 추론 서버(inference server)도 없고, 클라우드 호출도 없으며, 원격 측정(telemetry) 기능도 없습니다. 사용자가 자체 ONNX 모델을 제공하며, 서버는 설정과 관심 영역 상자(region-of-interest boxes)만 저장합니다. 셀프 호스팅 프라이버시 환경에서는 이것이 중요합니다: "이 프레임에 사람이 있는가"라는 결정은 실행된 브라우저 탭을 절대 벗어나지 않습니다.
스마트 홈 배선: Home Assistant 및 자동화 사용자용:
- Home Assistant 통합: 지원 플랫폼으로 등재된 최고 수준의 기능입니다.
- MQTT 트리거(sensor event): 센서 이벤트가 카메라 녹화를 시작합니다.
- WebDAV / FTP: 녹화본 파일 접근이 가능합니다.
- DLNA / UPnP-AV 캐스트: 녹화본을 TV나 미디어 플레이어로 바로 전송할 수 있습니다.
- 외부 경고 웹훅(webhook): 이벤트는 HMAC 서명과 함께 사용자의 자체 HTTP 엔드포인트로 전달됩니다 (기본적으로 비활성화). 따라서 문 이벤트가 클립을 시작할 수 있고, 그 클립은 Home Assistant 또는 다른 도구들이 이미 읽고 있는 공유 공간에 저장될 수 있습니다.
실행 환경 선택: 맞는 형태를 고르세요:
- 단일 바이너리(One binary): 다운로드하여 실행하고 9090 포트를 엽니다. (CGO_ENABLED=0, 정적 빌드, 임베디드 UI)
- Docker Compose: 항상 작동하는 장치에 일반적으로 사용되는 경로입니다.
- 원클릭 스크립트(One-click script): nvr 사용자 및 systemd 유닛을 생성합니다.
- 네이티브 Linux 패키지: 시스템 관리자가 처리하는 .deb 및 .rpm 파일이며, 데이터는 /var/lib/mibee-nvr에 저장되어 제거해도 녹화본에는 영향을 주지 않습니다.
- fnOS (FlyNAS) 패키지: 네이티브 빌드(~30 MB 유휴 상태, FFmpeg 없음으로 트랜스코딩 기능은 비활성화되었지만 녹화/실시간/API는 완벽함)와 독립적인 포트에 나란히 배치된 전체 Docker 빌드가 제공됩니다.
- Windows 및 macOS 데스크톱: 시스템 트레이 앱과 메뉴 바 앱입니다. 필요할 때 요청하는 뷰어(보고 싶을 때 시작하고, 끝났을 때 종료) 또는 클립 캡처 워크스테이션으로 유용합니다.
문서화된 NAS 대상: unRAID, fnOS, iStoreOS, Synology, QNAP, ZSpace.
이 시스템은 그렇지 않았다면 재활용했을 오래된 PC나 Pi급 싱글 보드 컴퓨터(SBC)에서도 원활하게 실행됩니다. 이것이 바로 낮은 사양 요구 사항의 핵심입니다.
포트 개방 없이 원격 접속 (v0.14.0)에서는 공용 IP나 포트 포워딩 없이도 원격 접속 기능을 추가했습니다. 기본적으로 비활성화되어 있으며, 프로젝트의 릴레이를 통해 LAN 외부에서도 웹 UI와 보조 앱에 접근할 수 있습니다. 녹화본은 여전히 사용자의 하드웨어에 저장되며, 세션 정보만 전송됩니다.
자체적인 상태 유지 기능: 불안정한 카메라가 침묵하는 공백이 되지 않도록 몇 가지 기능이 백그라운드에서 실행됩니다. 자동 복구 기능을 갖춘 다층적 건강 검사 및 카메라별 품질 점수(quality score)를 제공합니다.
IP 자체 복구: 카메라가 새로운 주소로 이동하더라도 일련번호(serial number)를 통해 재발견되고 다시 연결됩니다.
내장된 SNTP 서버를 통한 카메라 시계 보정 기능으로 타임스탬프 드리프트(timestamp drift)가 검색이나 인증에 문제를 일으키지 않습니다.
mDNS 및 UDP 브로드캐스트를 통한 LAN 검색을 지원하며, /api/health에서 안정적인 장치 ID(device ID)를 노출합니다.
솔직한 한계점: 놀라지 않도록 알려드립니다. 하드웨어 가속 디코딩 경로는 아직 성숙 단계에 있습니다. 소프트웨어 경로는 안정적이며, GPU 오프로드는 진행 중입니다(work in progress).
GB/T 28181은 중국 시장 표준입니다. 해당 카메라를 보유하고 있다면 유용하지만 그렇지 않다면 무관하며, 기본적으로 비활성화되어 있습니다(off by default).
여러 기능이 기본적으로 비활성화되어 제공됩니다(원격 접속, 도어벨, DLNA, 오디오 녹화). 필요한 기능을 활성화하십시오.
문서는 코드의 뒤를 따릅니다. README와 docs/가 현재 동작 방식과 가장 유사하며, 충돌이 발생할 경우 릴리스 노트(release notes)가 우선합니다.
참고할 곳 (저장소 및 v0.14.1 릴리스): https://github.com/Mi-Bee-Studio/MiBeeNvr 사이트: https://nvr.mickeybee.cn/
만약 특이한 하드웨어 또는 등록되지 않는 카메라로 실행하는 경우, 저에게 알려주시기 바랍니다. 그러한 사례들이 바로 다음 호환성 수정(compatibility fix)으로 이어지는 케이스입니다.
/u/No-Reception-84가 제출함 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/SelfHosted (AI filter)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기