Introduction
This is a simple rtmp library for easy use and reading, you can build your own single rtmp server or a cluster .
Examples
Client
You can use this library to push or pull RTMP streams , refer to the pprtmp example from xiu/application/pprtmp.
Single Server
use rtmp::{
relay::{pull_client::PullClient, push_client::PushClient},
rtmp::RtmpServer,
};
use {anyhow::Result, streamhub::StreamsHub};
fn start_single_server() {
let mut stream_hub = StreamsHub::new(None);
let sender = stream_hub.get_hub_event_sender();
let listen_port = 1935;
let address = format!("0.0.0.0:{port}", port = listen_port);
let mut rtmp_server = RtmpServer::new(address, sender, 1);
tokio::spawn(async move {
if let Err(err) = rtmp_server.run().await {
log::error!("rtmp server error: {}\n", err);
}
});
tokio::spawn(async move { stream_hub.run().await });
}
#[tokio::main]
async fn main() -> Result<()> {
start_single_server();
tokio::signal::ctrl_c().await?;
Ok(())
}
Cluster
use rtmp::{
relay::{pull_client::PullClient, push_client::PushClient},
rtmp::RtmpServer,
};
use {anyhow::Result, streamhub::StreamsHub};
fn start_cluster() {
let mut stream_hub = StreamsHub::new(None);
let sender = stream_hub.get_hub_event_sender();
let address = format!("{ip}:{port}", ip = "192.168.0.2", port = 1935);
let mut push_client = PushClient::new(
address,
stream_hub.get_client_event_consumer(),
sender.clone(),
);
tokio::spawn(async move {
if let Err(err) = push_client.run().await {
log::error!("push client error {}\n", err);
}
});
stream_hub.set_rtmp_push_enabled(true);
let address = format!("{ip}:{port}", ip = "192.168.0.3", port = "1935");
log::info!("start rtmp pull client from address: {}", address);
let mut pull_client = PullClient::new(
address,
stream_hub.get_client_event_consumer(),
sender.clone(),
);
tokio::spawn(async move {
if let Err(err) = pull_client.run().await {
log::error!("pull client error {}\n", err);
}
});
stream_hub.set_rtmp_pull_enabled(true);
let listen_port = 1935;
let address = format!("0.0.0.0:{port}", port = listen_port);
let mut rtmp_server = RtmpServer::new(address, sender.clone(), 1);
tokio::spawn(async move {
if let Err(err) = rtmp_server.run().await {
log::error!("rtmp server error: {}\n", err);
}
});
tokio::spawn(async move { stream_hub.run().await });
}
#[tokio::main]
async fn main() -> Result<()> {
start_cluster();
tokio::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
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
v0.0.9
- Support cache GOP;
- Fix bugs;
- Refactor handshake mod;
v0.0.12
v0.0.13
- Add introductions and example codes in doc
v0.0.14
- Fix handshake error.[#23]
v0.1.0
- Update RTMP library version.
v0.2.0
- Support audio and video information statistics.
v0.3.0
- Support notify stream status.
- Add HTTP API to kickoff clients.
- Fix some client session bugs.
v0.3.1
- Fix error that cannot receive rtmp stream pushed from GStreamer.
- Reference xflv new version v0.2.1.
- Fix RTMP examples in README.
v0.4.0
- Reference bytesio v0.3.0.
- Support transferring from rtsp to rtmp.
- Do some refactoring.
0.4.2
- Reference streamhub new version v0.1.2.
v0.5.0
- Remove no used "\n" for error message.
- Receive and process sub event result.
- Fix RTMP chunk parse error.
- Fix RTMP chunks are uncompressed in packetizer mod.
- Fix err: when encountering an unknown RTMP message type, it should be skipped rather than returning an error.
- Support remuxing from WHIP to rtmp.
0.6.0
0.6.1