The immediate motivation is to address these CI failures with nightly: https://github.com/scottlamb/moonfire-nvr/runs/2593322801?check_suite_focus=true ``` Compiling lock_api v0.4.2 error[E0557]: feature has been removed --> /home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/lock_api-0.4.2/src/lib.rs:91:42 | 91 | #![cfg_attr(feature = "nightly", feature(const_fn))] | ^^^^^^^^ feature has been removed | = note: split into finer-grained feature gates ``` Strangely, they don't occur locally with "rustc 1.54.0-nightly (fe72845f7 2021-05-16)" but do on CI with the exact same version?!? I don't get it, but lock-api 0.4.4 is advertised as being updated for latest nightly, so I expect this will address the problem anyway.
Introduction
Moonfire NVR is an open-source security camera network video recorder, started
by Scott Lamb <slamb@slamb.org>. It saves H.264-over-RTSP streams from
IP cameras to disk into a hybrid format: video frames in a directory on
spinning disk, other data in a SQLite3 database on flash. It can construct
.mp4
files for arbitrary time ranges on-the-fly. It does not decode,
analyze, or re-encode video frames, so it requires little CPU. It handles six
1080p/30fps streams on a Raspberry Pi
2, using
less than 10% of the machine's total CPU.
Help wanted to make it great! Please see the contributing guide.
So far, the web interface is basic: a filterable list of video segments, with support for trimming them to arbitrary time ranges. No scrub bar yet. There's also an experimental live view UI.
![]() |
![]() |
There's no support yet for motion detection, no https/TLS support (you'll need a proxy server, as described here), and only a console-based (rather than web-based) configuration UI.
Moonfire NVR is currently at version 0.6.3. Until version 1.0, there will be no compatibility guarantees: configuration and storage formats may change from version to version. There is an upgrade procedure but it is not for the faint of heart.
I hope to add features such as video analytics. In time, we can build a full-featured hobbyist-oriented multi-camera NVR that requires nothing but a cheap machine with a big hard drive. There are many exciting techniques we could use to make this possible:
- avoiding CPU-intensive H.264 encoding in favor of simply continuing to use the camera's already-encoded video streams. Cheap IP cameras these days provide pre-encoded H.264 streams in both "main" (full-sized) and "sub" (lower resolution, compression quality, and/or frame rate) varieties. The "sub" stream is more suitable for fast computer vision work as well as remote/mobile streaming. Disk space these days is quite cheap (with 4 TB drives costing about $100), so we can afford to keep many camera-months of both streams on disk.
- off-loading on-NVR analytics to an inexpensive USB or M.2 neural network accelerator and hardware H.264 decoders.
- taking advantage of on-camera analytics. They're often not as accurate, but they're the best way to stretch very inexpensive NVR machines.
Documentation
- Contributing
- License — GPL-3.0-or-later with GPL-3.0-linking-exception for OpenSSL.
- Change log / release notes.
- Guides
- Design documents
- Wiki has hardware recommendations, notes on several camera models, etc. Please add more!