Moonfire NVR, a security camera network video recorder
Go to file
Scott Lamb 422cd2a75e preliminary web support for auth (#26)
Some caveats:

  * it doesn't record the peer IP yet, which makes it harder to verify
    sessions are valid. This is a little annoying to do in hyper now
    (see hyperium/hyper#1410). The direct peer might not be what we want
    right now anyway because there's no TLS support yet (see #27).  In
    the meantime, the sane way to expose Moonfire NVR to the Internet is
    via a proxy server, and recording the proxy's IP is not useful.
    Maybe better to interpret a RFC 7239 Forwarded header (and/or
    the older X-Forwarded-{For,Proto} headers).

  * it doesn't ever use Secure (https-only) cookies, for a similar reason.
    It's not safe to use even with a tls proxy until this is fixed.

  * there's no "moonfire-nvr config" support for inspecting/invalidating
    sessions yet.

  * in debug builds, logging in is crazy slow. See libpasta/libpasta#9.

Some notes:

  * I removed the Javascript "no-use-before-defined" lint, as some of
    the functions form a cycle.

  * Fixed #20 along the way. I needed to add support for properly
    returning non-OK HTTP statuses to signal unauthorized and such.

  * I removed the Access-Control-Allow-Origin header support, which was
    at odds with the "SameSite=lax" in the cookie header. The "yarn
    start" method for running a local proxy server accomplishes the same
    thing as the Access-Control-Allow-Origin support in a more secure
    manner.
2018-11-27 11:08:33 -08:00
base upgrade a few deps 2018-08-24 22:06:14 -07:00
ci build and lint the UI in travis-ci 2018-08-31 08:19:56 -07:00
db preliminary web support for auth (#26) 2018-11-27 11:08:33 -08:00
design preliminary web support for auth (#26) 2018-11-27 11:08:33 -08:00
ffmpeg initial split of database to a separate crate 2018-02-20 23:15:39 -08:00
guide preliminary web support for auth (#26) 2018-11-27 11:08:33 -08:00
scripts update most deps, notably including reqwest 2018-11-20 09:32:55 -08:00
src preliminary web support for auth (#26) 2018-11-27 11:08:33 -08:00
ui-src preliminary web support for auth (#26) 2018-11-27 11:08:33 -08:00
webpack couple fixes to the dialog close button 2018-04-28 06:39:29 -07:00
.dockerignore Initial docker support (#55) 2018-03-25 21:03:02 -07:00
.eslintrc.json preliminary web support for auth (#26) 2018-11-27 11:08:33 -08:00
.gitignore Major refactoring of UI code, small UI changes. (#48) 2018-03-20 07:03:12 -07:00
.jsbeautifyrc Major refactoring of UI code, small UI changes. (#48) 2018-03-20 07:03:12 -07:00
.prettierrc.json Major refactoring of UI code, small UI changes. (#48) 2018-03-20 07:03:12 -07:00
.travis.yml upgrade some JS deps to work with node 11 2018-11-20 11:06:20 -08:00
Cargo.lock preliminary web support for auth (#26) 2018-11-27 11:08:33 -08:00
Cargo.toml preliminary web support for auth (#26) 2018-11-27 11:08:33 -08:00
Dockerfile more robust timezone detection (fixes #12) 2018-08-31 17:19:24 -07:00
LICENSE.txt Initial commit, with basic functionality. 2016-01-01 22:06:47 -08:00
moonfire.sublime-project Major refactoring of UI code, small UI changes. (#48) 2018-03-20 07:03:12 -07:00
package.json A little more UI refactor, cleanup, eslint more strict (#54) 2018-03-25 22:18:56 -07:00
README.md preliminary web support for auth (#26) 2018-11-27 11:08:33 -08:00
screenshot-small.png add a basic Javascript UI 2017-10-21 21:54:27 -07:00
screenshot.png add a basic Javascript UI 2017-10-21 21:54:27 -07:00
settings-nvr.js Major refactoring of UI code, small UI changes. (#48) 2018-03-20 07:03:12 -07:00
yarn.lock upgrade some JS deps to work with node 11 2018-11-20 11:06:20 -08:00

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.

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 no support for motion detection, no https/SSL/TLS support (you'll need a proxy server), and no config UI.

screenshot

This is version 0.1, the initial release. 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 salient motion detection. It's way too early to make promises, but it seems possible to build a full-featured hobbyist-oriented multi-camera NVR that requires nothing but a cheap machine with a big hard drive. I welcome help; see Getting help and getting involved below. 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 3 TB drives costing about $100), so we can afford to keep many camera-months of both streams on disk.
  • decoding and analyzing only select "key" video frames (see wikipedia).
  • off-loading expensive work to a GPU. Even the Raspberry Pi has a surprisingly powerful GPU.
  • using HTTP Live Streaming rather than requiring custom browser plug-ins.
  • taking advantage of cameras' built-in motion detection. This is the most obvious way to reduce motion detection CPU. It's a last resort because these cheap cameras' proprietary algorithms are awful compared to those described on changedetection.net. Cameras have high false-positive and false-negative rates, are hard to experiment with (as opposed to rerunning against saved video files), and don't provide any information beyond if motion exceeded the threshold or not.

Documentation

Getting help and getting involved

Please email the moonfire-nvr-users mailing list with questions, or just to say you love/hate the software and why. You can also file bugs and feature requests on the github issue tracker.

I'd welcome help with testing, development (in Rust, JavaScript, and HTML), user interface/graphic design, and documentation. Please email the mailing list if interested. Pull requests are welcome, but I encourage you to discuss large changes on the mailing list or in a github issue first to save effort.