A C++20 implementation of RoQR (RTMP over QUIC, draft-gregoire-rtmp-over-quic) with a sans-I/O protocol core, a picoquic transport, an RTMP/AMF gateway module, a test relay, and example gateways.
ffmpeg (RTMP publish) -> roqr-ingest -> roqr-relayd -> roqr-egress -> ffmpeg (RTMP play)
RoQR carries RTMP message metadata and payloads over QUIC streams and DATAGRAM frames. The gateways auto-reconnect to the relay if the QUIC connection drops.
- docs/guide.md — development, deployment, and the full configuration reference (build options, CLI flags, and library options).
cmake/android-jni.md— Android NDK cross-compile for the JNI bindings.docs/reference/— vendored Enhanced RTMP (E-RTMP) specifications.
eval "$(scripts/setup_picoquic_deps.sh)" # clone + build pinned picoquic/picotls
cmake --preset dev
cmake --build --preset dev
ctest --preset dev
The core protocol library builds without picoquic:
cmake -S . -B build -DROQR_BUILD_QUIC=OFF -DROQR_BUILD_EXAMPLES=OFF && cmake --build build.
core/sans-I/O RoQR frame codec, flow table (no dependencies)quic/picoquic client transportrtmp/RTMP handshake, chunking, AMF0, E-RTMP media classifiergateway/RTMP<->RoQR bridge, ingest/egress gatewaystools/relayd/the RoQR test relayexamples/roqr-ingest, roqr-egress, roqr-duplex
ffi/a C ABI (roqr.hfor the client,roqr_rtmp.hfor the ingest/egress gateways) inlibroqr-ffi.so.jni/JNI bindings (org.red5.roqr) inlibroqr-jni.so+roqr.jar, built when-DROQR_BUILD_JNI=ONand a JDK is present.examples/java/Java publish/play samples (seeexamples/java/README.md).examples/rust/a Rust client over the C FFI (seeexamples/rust/README.md).- Android: see
cmake/android-jni.mdfor the NDK cross-compile.
Native callbacks (MessageListener) fire on a native thread the binding
attaches to the JVM for the call; do not block in them.
License: Apache-2.0.
