15 releases

1.0.0 Jan 21, 2023
0.2.0 Mar 12, 2023
0.1.0 Feb 5, 2023
0.0.14 Jul 21, 2022
0.0.5 Jun 24, 2021

#45 in Video

Download history 21/week @ 2022-11-28 29/week @ 2022-12-05 37/week @ 2022-12-12 22/week @ 2022-12-19 18/week @ 2022-12-26 14/week @ 2023-01-02 25/week @ 2023-01-09 44/week @ 2023-01-16 69/week @ 2023-01-23 63/week @ 2023-01-30 70/week @ 2023-02-06 143/week @ 2023-02-13 42/week @ 2023-02-20 22/week @ 2023-02-27 33/week @ 2023-03-06 29/week @ 2023-03-13

134 downloads per month
Used in 3 crates

MIT license

340KB
8K SLoC

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

  • support rtmp pushlish and play

v0.0.2

  • support rtmp relay pull and static push

v0.0.3

  • add amf0 functions

v0.0.4

  • add timestamp for metadata

v0.0.5

  • support complex handshake

v0.0.6

  • refactor some codes,update dependencies

v0.0.7

  • Fix bugs;
  • add detail logs;
  • improve subscriber id;

v0.0.8

  • Fix bugs;

v0.0.9

  • Support cache GOP;
  • fix bugs;
  • refactor handshake mod;

v0.0.12

  • Fix overflow error.[#17]

v0.0.13

  • add introductions and example codes in doc

v0.0.14

  • fix handshake error.[#23]

v0.1.0

  • Fix error chain.

Dependencies

~7–12MB
~210K SLoC