xref: /xiu/protocol/rtmp/README.md (revision 80f20d70)
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