5 releases

Uses new Rust 2024

new 0.2.2 May 17, 2025
0.2.1 May 15, 2025
0.2.0 Apr 27, 2025
0.1.1 Feb 21, 2025
0.0.1 Feb 9, 2025

#72 in Video

Download history 232/week @ 2025-02-09 145/week @ 2025-02-16 23/week @ 2025-02-23 14/week @ 2025-03-02 2/week @ 2025-03-09 1/week @ 2025-04-06 1/week @ 2025-04-13 127/week @ 2025-04-27 11/week @ 2025-05-04 151/week @ 2025-05-11

289 downloads per month

MIT/Apache

430KB
8K SLoC

scuffle-rtmp

[!WARNING]
This crate is under active development and may not be stable.

License: MIT OR Apache-2.0 docs.rs crates.io GitHub Actions: ci Codecov


A crate for handling RTMP server connections.

See the changelog for a full release history.

Specifications

Name Version Link Comments
Adobe’s Real Time Messaging Protocol 1.0 https://github.com/veovera/enhanced-rtmp/blob/main/docs/legacy/rtmp-v1-0-spec.pdf Refered to as ‘Legacy RTMP spec’ in this documentation
Enhancing RTMP, FLV v1-2024-02-29-r1 https://github.com/veovera/enhanced-rtmp/blob/main/docs/enhanced/enhanced-rtmp-v1.pdf
Enhanced RTMP v2-2024-10-22-b1 https://github.com/veovera/enhanced-rtmp/blob/main/docs/enhanced/enhanced-rtmp-v2.pdf Refered to as ‘Enhanced RTMP spec’ in this documentation

Feature flags

  • docs — Enables changelog and documentation of feature flags

Example

struct Handler;

impl SessionHandler for Handler {
    async fn on_data(&mut self, stream_id: u32, data: SessionData) -> Result<(), ServerSessionError> {
        // Handle incoming video/audio/meta data
        Ok(())
    }

    async fn on_publish(&mut self, stream_id: u32, app_name: &str, stream_name: &str) -> Result<(), ServerSessionError> {
        // Handle the publish event
        Ok(())
    }

    async fn on_unpublish(&mut self, stream_id: u32) -> Result<(), ServerSessionError> {
        // Handle the unpublish event
        Ok(())
    }
}

#[tokio::main]
async fn main() {
    let listener = TcpListener::bind("[::]:1935").await.unwrap();
    // listening on [::]:1935

    while let Ok((stream, addr)) = listener.accept().await {
        let session = ServerSession::new(stream, Handler);

        tokio::spawn(async move {
            if let Err(err) = session.run().await {
                // Handle the session error
            }
        });
    }
}

License

This project is licensed under the MIT or Apache-2.0 license. You can choose between one of them if you use this work.

SPDX-License-Identifier: MIT OR Apache-2.0

Dependencies

~4–12MB
~121K SLoC

OSZAR »