Introduction

This is a simple rtmp library for easy use and reading, you can build your own single rtmp server or a cluster .

Examples

Single Server

use rtmp::channels::channels::ChannelsManager;
use rtmp::rtmp::RtmpServer;

#[tokio::main]

async fn main() -> Result<()> {

    let mut channel = ChannelsManager::new();
    let producer = channel.get_session_event_producer();

    let listen_port = 1935;
    let address = format!("0.0.0.0:{port}", port = listen_port);

    let mut rtmp_server = RtmpServer::new(address, producer.clone());
    tokio::spawn(async move {
        if let Err(err) = rtmp_server.run().await {
            log::error!("rtmp server error: {}\n", err);
        }
    });

    tokio::spawn(async move { channel.run().await });

    signal::ctrl_c().await?;
    Ok(())
}

Cluster

use rtmp::channels::channels::ChannelsManager;
use rtmp::rtmp::RtmpServer;
use rtmp::relay::{pull_client::PullClient, push_client::PushClient},

#[tokio::main]

async fn main() -> Result<()> {

    let mut channel = ChannelsManager::new();
    let producer = channel.get_session_event_producer();

    // push the rtmp stream from local to 192.168.0.2:1935
    let address = format!(
        "{ip}:{port}",
        ip = "192.168.0.2",
        port = 1935
    );

    let mut push_client = PushClient::new(
        address,
        channel.get_client_event_consumer(),
        producer.clone(),
    );
    tokio::spawn(async move {
        if let Err(err) = push_client.run().await {
            log::error!("push client error {}\n", err);
        }
    });
    channel.set_rtmp_push_enabled(true);

    //pull the rtmp stream from 192.168.0.3:1935 to local
    let address = format!(
              "{ip}:{port}",
              ip = "192.168.0.3",
              port = pull_cfg_value.port
          );
    log::info!("start rtmp pull client from address: {}", address);
    let mut pull_client = PullClient::new(
        address,
        channel.get_client_event_consumer(),
        producer.clone(),

    tokio::spawn(async move {
        if let Err(err) = pull_client.run().await {
            log::error!("pull client error {}\n", err);
        }
    });
    channel.set_rtmp_pull_enabled(true);


    // the local rtmp server
    let listen_port = 1935;
    let address = format!("0.0.0.0:{port}", port = listen_port);

    let mut rtmp_server = RtmpServer::new(address, producer.clone());
    tokio::spawn(async move {
        if let Err(err) = rtmp_server.run().await {
            log::error!("rtmp server error: {}\n", err);
        }
    });

    tokio::spawn(async move { channel.run().await });

    signal::ctrl_c().await?;
    Ok(())
}

For more detailed implementation please reference to xiu server

Version History

v0.0.1

v0.0.2

v0.0.3

v0.0.4

v0.0.5

v0.0.6

v0.0.7

v0.0.8

v0.0.9

v0.0.12

v0.0.13

In the end

Star the project if you like and which can make it go faster and further.