retina
![CI](https://github.com/scottlamb/retina/workflows/CI/badge.svg)
High-level RTSP multimedia streaming library, in Rust. Good support for
ONVIF RTSP/1.0 IP surveillance cameras, as needed by
Moonfire NVR. Works around
brokenness in cheap closed-source cameras.
Status: In production use in Moonfire NVR. Many missing features.
Progress:
- [x] client support
- [x] basic authentication.
- [x] digest authentication.
- [x] RTP over TCP via RTSP interleaved channels.
- [x] RTP over UDP (experimental).
-
- [ ] re-order buffer. (Out-of-order packets are dropped now.)
- [x] RTSP/1.0.
- [ ] RTSP/2.0.
- [ ] SRTP.
- [ ] ONVIF backchannel support (for sending audio).
- [ ] ONVIF replay mode.
- [x] receiving RTCP Sender Reports (currently only uses the timestamp)
- [ ] sending RTCP Receiver Reports
- [ ] server support
- I/O modes
- [x] async with tokio
- [ ] async-std
- [ ] synchronous with std only
- codec depacketization
- [x] video
- [x] H.264
- [ ] SVC
- [ ] periodic infra refresh
- [x] multiple slices per picture
- [ ] multiple SPS/PPS
- [ ] interleaved mode
- [x] AAC output format
- [ ] Annex B output format (#44)
- [x] (RFC 6184)
- [x] MJPEG
- audio
- [x] AAC
- [x] RFC 3551
codecs: G.711, G.723, L8/L16
- [x] application: ONVIF metadata
- [ ] clean, stable API. (See #47.)
- quality errors
-
- [x] detailed error description text.
-
- [ ] programmatically inspectable error type.
- [ ] good functional testing coverage. (Currently lightly / unevenly tested.
Most depacketizers have no tests.)
- [ ] fuzz testing. (In progress.)
- [x] benchmark
Help welcome!
Getting started
Try the mp4
example. It streams from an RTSP server to a .mp4
file until
you hit ctrl-C.
$ cargo run --package client mp4 --url rtsp://ip.address.goes.here/ --username admin --password test out.mp4
...
^C
Example client
$ cargo run --package client <CMD>
Where CMD:
- info - Gets info about available streams and exits.
- mp4 - Writes RTSP streams to mp4 file; exit with Ctrl+C.
- onvif - Gets realtime onvif metadata if available; exit with Ctrl+C.
- jpeg - Writes depacketized JPEG images to disk; exit with CTRL+C.
Example WebRTC proxy
This allows viewing a H.264 video stream from your browser, with the help of
webrtc-rs
.
$ cargo run --package webrtc-proxy -- --help
Acknowledgements
This builds on the whole Rust ecosystem. A couple folks have been especially
helpful:
Why "retina"?
It's a working name. Other ideas welcome. I started by looking at dictionary
words with the letters R, T, S, and P in order and picking out ones related to
video:
$ egrep '^r.*t.*s.*p' /usr/share/dict/words' |
|
retinoscope |
close but too long, thus retina |
retrospect |
good name for an NVR, but I already picked Moonfire |
rotascope |
misspelling of "rotascope" (animation tool) or archaic name for "gyroscope"? |
License
Your choice of MIT or Apache; see LICENSE-MIT.txt or
LICENSE-APACHE, respectively.