High-level RTSP multimedia streaming library, in Rust
Go to file
Scott Lamb 1a00b5e92a properly request unicast with udp
https://github.com/scottlamb/moonfire-nvr/issues/192#issuecomment-1025396306

RFC 2326 section 12.39 says if this is omitted, it defaults to
multicast. Retina doesn't support multicast, so explicitly say unicast.
This was already done correctly for TCP but not for UDP.
2022-01-30 21:33:03 -08:00
.github/workflows try to fix CI error 2021-08-19 13:19:04 -07:00
benches experimental UDP support (fixes #30) 2021-08-30 21:40:51 -07:00
examples/client mp4 example: allow in-band h264 params 2022-01-30 21:18:47 -08:00
fuzz prepare v0.3.1 2021-09-09 22:01:58 -07:00
src properly request unicast with udp 2022-01-30 21:33:03 -08:00
.gitignore initial commit 2021-06-03 16:49:53 -07:00
Cargo.lock prep v0.3.7 2022-01-28 09:17:22 -08:00
Cargo.toml prep v0.3.7 2022-01-28 09:17:22 -08:00
CHANGELOG.md prep v0.3.7 2022-01-28 09:17:22 -08:00
LICENSE-APACHE.txt initial commit 2021-06-03 16:49:53 -07:00
LICENSE-MIT.txt initial commit 2021-06-03 16:49:53 -07:00
README.md update overall crate status 2022-01-25 23:42:59 -08:00

retina

crates.io version Documentation CI

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. Some breaking changes needed to clean up APIs (see #47.)

Progress:

  • client support
    • basic authentication.
    • digest authentication.
    • RTP over TCP via RTSP interleaved channels.
    • RTP over UDP (experimental).
      • re-order buffer. (Out-of-order packets are dropped now.)
    • RTSP/1.0.
    • RTSP/2.0.
    • SRTP.
    • ONVIF backchannel support (for sending audio).
    • ONVIF replay mode.
    • receiving RTCP Sender Reports (currently only uses the timestamp)
    • sending RTCP Receiver Reports
  • server support
  • I/O modes
    • async with tokio
    • async-std
    • synchronous with std only
  • codec depacketization
    • video: H.264 (RFC 6184)
      • SVC
      • periodic infra refresh
      • multiple slices per picture
      • multiple SPS/PPS
      • interleaved mode
      • AAC output format
      • Annex B output format (#44)
    • audio
      • AAC
        • interleaving
      • RFC 3551 codecs: G.711, G.723, L8/L16
    • application: ONVIF metadata
  • clean, stable API. (See #47.)
  • quality errors
    • 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.)
  • 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 --example client mp4 --url rtsp://ip.address.goes.here/ --username admin --password test out.mp4
...
^C

Example client

$ cargo run --example client <CMD>

Where CMD:

  • info - Get info about available streams and exit
  • mp4 - Write RTSP streams to mp4 file, exit with Ctrl+C
  • metadata - Get realtime onvif metadata if available, exit with Ctrl+C

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.