1# Introduction 2 3This is a simple rtmp library for easy use and reading, you can build your own single rtmp server or a cluster . 4 5# Examples 6 7## Client 8 9 You can use this library to push or pull RTMP streams , refer to the pprtmp example from xiu/application/pprtmp. 10 11## Single Server 12 13```rust 14use rtmp::{ 15 relay::{pull_client::PullClient, push_client::PushClient}, 16 rtmp::RtmpServer, 17}; 18 19 use {anyhow::Result, streamhub::StreamsHub}; 20 21fn start_single_server() { 22 let mut stream_hub = StreamsHub::new(None); 23 let sender = stream_hub.get_hub_event_sender(); 24 25 let listen_port = 1935; 26 let address = format!("0.0.0.0:{port}", port = listen_port); 27 28 let mut rtmp_server = RtmpServer::new(address, sender, 1); 29 tokio::spawn(async move { 30 if let Err(err) = rtmp_server.run().await { 31 log::error!("rtmp server error: {}\n", err); 32 } 33 }); 34 35 tokio::spawn(async move { stream_hub.run().await }); 36} 37 38#[tokio::main] 39 40async fn main() -> Result<()> { 41 start_single_server(); 42 //start_cluster(); 43 tokio::signal::ctrl_c().await?; 44 Ok(()) 45} 46``` 47 48## Cluster 49 50```rust 51use rtmp::{ 52 relay::{pull_client::PullClient, push_client::PushClient}, 53 rtmp::RtmpServer, 54}; 55 56 use {anyhow::Result, streamhub::StreamsHub}; 57 58fn start_cluster() { 59 let mut stream_hub = StreamsHub::new(None); 60 let sender = stream_hub.get_hub_event_sender(); 61 62 // push the rtmp stream from local to 192.168.0.2:1935 63 let address = format!("{ip}:{port}", ip = "192.168.0.2", port = 1935); 64 65 let mut push_client = PushClient::new( 66 address, 67 stream_hub.get_client_event_consumer(), 68 sender.clone(), 69 ); 70 tokio::spawn(async move { 71 if let Err(err) = push_client.run().await { 72 log::error!("push client error {}\n", err); 73 } 74 }); 75 stream_hub.set_rtmp_push_enabled(true); 76 77 //pull the rtmp stream from 192.168.0.3:1935 to local 78 let address = format!("{ip}:{port}", ip = "192.168.0.3", port = "1935"); 79 log::info!("start rtmp pull client from address: {}", address); 80 let mut pull_client = PullClient::new( 81 address, 82 stream_hub.get_client_event_consumer(), 83 sender.clone(), 84 ); 85 86 tokio::spawn(async move { 87 if let Err(err) = pull_client.run().await { 88 log::error!("pull client error {}\n", err); 89 } 90 }); 91 stream_hub.set_rtmp_pull_enabled(true); 92 93 // the local rtmp server 94 let listen_port = 1935; 95 let address = format!("0.0.0.0:{port}", port = listen_port); 96 97 let mut rtmp_server = RtmpServer::new(address, sender.clone(), 1); 98 tokio::spawn(async move { 99 if let Err(err) = rtmp_server.run().await { 100 log::error!("rtmp server error: {}\n", err); 101 } 102 }); 103 104 tokio::spawn(async move { stream_hub.run().await }); 105} 106 107#[tokio::main] 108 109async fn main() -> Result<()> { 110 start_cluster(); 111 tokio::signal::ctrl_c().await?; 112 Ok(()) 113} 114``` 115 116 For more detailed implementation please reference to [xiu server](https://github.com/harlanc/xiu/blob/master/application/xiu/src/main.rs) 117 118 119 120# Version History 121## v0.0.1 122- Support rtmp pushlish and play 123## v0.0.2 124- Support rtmp relay pull and static push 125## v0.0.3 126- Add amf0 functions 127## v0.0.4 128- Add timestamp for metadata 129## v0.0.5 130- Support complex handshake 131## v0.0.6 132- Refactor some codes,update dependencies 133## v0.0.7 134- Fix bugs; 135- Add detail logs; 136- Improve subscriber id; 137## v0.0.8 138- Fix bugs; 139## v0.0.9 140- Support cache GOP; 141- Fix bugs; 142- Refactor handshake mod; 143## v0.0.12 144- Fix overflow error.[#17] 145## v0.0.13 146- Add introductions and example codes in doc 147## v0.0.14 148- Fix handshake error.[#23] 149## v0.1.0 150- Update RTMP library version. 151## v0.2.0 152- Support audio and video information statistics. 153## v0.3.0 154- Support notify stream status. 155- Add HTTP API to kickoff clients. 156- Fix some client session bugs. 157## v0.3.1 158- Fix error that cannot receive rtmp stream pushed from GStreamer. 159- Reference xflv new version v0.2.1. 160- Fix RTMP examples in README. 161## v0.4.0 162- Reference bytesio v0.3.0. 163- Support transferring from rtsp to rtmp. 164- Do some refactoring. 165## 0.4.2 166- Reference streamhub new version v0.1.2. 167 168 169 170 171