High-level RTSP multimedia streaming library, in Rust
Go to file
Scott Lamb 24d5eeb701 add tokio runtime feature to Cargo.toml
Needed by 62f6949.

The normal tests didn't catch this because runtime is a dev-dependency.
The fuzz tests caught it by accident on CI:
https://github.com/scottlamb/retina/actions/runs/1219451203
2021-09-09 18:29:24 -07: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 new more reliable TEARDOWN mechanism 2021-09-09 17:34:49 -07:00
fuzz experimental UDP support (fixes #30) 2021-08-30 21:40:51 -07:00
src new more reliable TEARDOWN mechanism 2021-09-09 17:34:49 -07:00
.gitignore initial commit 2021-06-03 16:49:53 -07:00
Cargo.lock use sdp-types 0.1.3 with more permissive parsing 2021-09-09 06:58:15 -07:00
Cargo.toml add tokio runtime feature to Cargo.toml 2021-09-09 18:29:24 -07:00
CHANGELOG.md new more reliable TEARDOWN mechanism 2021-09-09 17:34:49 -07: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 experimental UDP support (fixes #30) 2021-08-30 21:40:51 -07: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.

Progress:

  • client support
    • 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. (Most of the crate's code is independent of the async library, so I don't expect this would be too hard to add.)
    • synchronous with std only
  • codec depacketization
    • video: H.264 (RFC 6184)
      • SVC
      • periodic infra refresh
      • multiple slices per picture
      • multiple SPS/PPS
      • interleaved mode
    • audio
      • AAC
        • interleaving
      • RFC 3551 codecs: G.711, G.723, L8/L16
    • application: ONVIF metadata
  • uniform, documented API. (Currently haphazard in terms of naming, what fields are exposed directly vs use an accessors, etc.)
  • 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

Currently very unstable: expect breaking API changes at every release as I work through items above.

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

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.