xref: /xiu/README_CN.md (revision 49702caa)
1888fa685SHarlanC<p align="center" width="100%">
2888fa685SHarlanC    <img width="38%" src="https://user-images.githubusercontent.com/10411078/149529602-7dcbaf26-55cd-4588-8989-206b76d32f07.png">
3888fa685SHarlanC</p>
4190df0f9SHarlanC
5190df0f9SHarlanC
6888fa685SHarlanC![XIU](https://img.shields.io/:XIU-blue.svg)[![crates.io](https://img.shields.io/crates/v/xiu.svg)](https://crates.io/crates/xiu)
7888fa685SHarlanC[![crates.io](https://img.shields.io/crates/d/xiu.svg)](https://crates.io/crates/xiu)
8888fa685SHarlanC![RTMP](https://img.shields.io/:RTMP-blue.svg)[![crates.io](https://img.shields.io/crates/v/rtmp.svg)](https://crates.io/crates/rtmp)
9888fa685SHarlanC[![crates.io](https://img.shields.io/crates/d/rtmp.svg)](https://crates.io/crates/rtmp)
1080f20d70SHarlanC![RTSP](https://img.shields.io/:RTSP-blue.svg)[![crates.io](https://img.shields.io/crates/v/xrtsp.svg)](https://crates.io/crates/xrtsp)
1180f20d70SHarlanC[![crates.io](https://img.shields.io/crates/d/xrtsp.svg)](https://crates.io/crates/xrtsp)
1280f20d70SHarlanC![WEBRTC](https://img.shields.io/:WEBRTC-blue.svg)[![crates.io](https://img.shields.io/crates/v/xwebrtc.svg)](https://crates.io/crates/xwebrtc)
1380f20d70SHarlanC[![crates.io](https://img.shields.io/crates/d/xwebrtc.svg)](https://crates.io/crates/xwebrtc)
14888fa685SHarlanC![HTTPFLV](https://img.shields.io/:HTTPFLV-blue.svg)[![crates.io](https://img.shields.io/crates/v/httpflv.svg)](https://crates.io/crates/httpflv)
15888fa685SHarlanC[![crates.io](https://img.shields.io/crates/d/httpflv.svg)](https://crates.io/crates/httpflv)
16888fa685SHarlanC![HLS](https://img.shields.io/:HLS-blue.svg)[![crates.io](https://img.shields.io/crates/v/hls.svg)](https://crates.io/crates/hls)
17888fa685SHarlanC[![crates.io](https://img.shields.io/crates/d/hls.svg)](https://crates.io/crates/hls)
18888fa685SHarlanC![FLV](https://img.shields.io/:FLV-blue.svg)[![crates.io](https://img.shields.io/crates/v/xflv.svg)](https://crates.io/crates/xflv)
19888fa685SHarlanC[![crates.io](https://img.shields.io/crates/d/xflv.svg)](https://crates.io/crates/xflv)
20888fa685SHarlanC![MPEGTS](https://img.shields.io/:MPEGTS-blue.svg)[![crates.io](https://img.shields.io/crates/v/xmpegts.svg)](https://crates.io/crates/xmpegts)
21888fa685SHarlanC[![crates.io](https://img.shields.io/crates/d/xmpegts.svg)](https://crates.io/crates/xmpegts)
22190df0f9SHarlanC[![](https://app.travis-ci.com/harlanc/xiu.svg?branch=master)](https://app.travis-ci.com/github/harlanc/xiu)
23a45f3c5dSwawacry[![](https://img.shields.io/discord/894502149764034560?logo=discord)](https://discord.gg/gS5wBRtpcB)
24a45f3c5dSwawacry![wechat](https://img.shields.io/:微信-harlancc-blue.svg)
25190df0f9SHarlanC
26190df0f9SHarlanC
2780f20d70SHarlanCXIU是用纯Rust开发的一款简单和安全的流媒体服务器,目前支持的流媒体协议包括RTMP[cluster]/RTSP/WebRTC[Whip/Whep]/HLS/HTTPFLV28190df0f9SHarlanC
29190df0f9SHarlanC## 功能
30190df0f9SHarlanC
31b36cf5daSHarlan- [x] 支持多平台(Linux/Mac/Windows32b36cf5daSHarlan- [x] 支持RTMP
3380f20d70SHarlanC  - [x] 支持发布和订阅H264/AAC 直播流;
3480f20d70SHarlanC  - [x] 支持秒开(Gop cache);
3580f20d70SHarlanC  - [x] 支持转换到HLS/HTTP-FLV协议;
3680f20d70SHarlanC  - [x] 支持部署集群;
37b36cf5daSHarlan- [x] 支持RTSP
3880f20d70SHarlanC   - [x] 支持通过TCP(Interleaved)和UDP发布或订阅H.265/H.264/AAC流;
3980f20d70SHarlanC   - [x] 支持转换到RTMP/HLS/HTTP-FLV协议;
4080f20d70SHarlanC- [x] 支持WebRTC(Whip/Whep4180f20d70SHarlanC   - [x] 支持使用Whip发布rtc流;
4280f20d70SHarlanC   - [x] 支持使用Whep订阅rtc流;
43b36cf5daSHarlan- [x] 支持订阅HLS/HTTPFLV直播流
44b36cf5daSHarlan- [x] 支持命令行或者配置文件配置服务
45b36cf5daSHarlan- [x] 支持HTTP API/notify
4680f20d70SHarlanC    - [x] 支持查询流信息;
4780f20d70SHarlanC    - [x] 支持流事件通知;
48b36cf5daSHarlan- [x] 支持token鉴权
4980f20d70SHarlanC- [x] 支持把直播流录制成HLS协议(m3u8+ts)文件
50190df0f9SHarlanC
51190df0f9SHarlanC## 准备工作
52190df0f9SHarlanC#### 安装 Rust and Cargo
53190df0f9SHarlanC
54190df0f9SHarlanC
55190df0f9SHarlanC[Document](https://doc.rust-lang.org/cargo/getting-started/installation.html)
56190df0f9SHarlanC
57190df0f9SHarlanC## 安装和运行
58190df0f9SHarlanC
59190df0f9SHarlanC有两种方式来安装xiu:
60190df0f9SHarlanC
61190df0f9SHarlanC - 直接用cargo来安装
62190df0f9SHarlanC - 源码编译安装
63190df0f9SHarlanC
64190df0f9SHarlanC
65190df0f9SHarlanC### 用cargo命令安装
66190df0f9SHarlanC
67*49702caaSJedanny执行下面的命令来安装xiu:
68190df0f9SHarlanC
69190df0f9SHarlanC    cargo install xiu
70190df0f9SHarlanC
7152b80a3cSHarlan执行下面的命令来查看帮助信息:
72190df0f9SHarlanC
7352b80a3cSHarlan    xiu -h
7452b80a3cSHarlan
7552b80a3cSHarlan    A secure and easy to use live media server, hope you love it!!!
7652b80a3cSHarlan
77b36cf5daSHarlan    Usage: xiu [OPTIONS]
7852b80a3cSHarlan
7952b80a3cSHarlan    Options:
8052b80a3cSHarlan      -c, --config <path>   Specify the xiu server configuration file path.
8152b80a3cSHarlan      -r, --rtmp <port>     Specify the RTMP listening port(e.g.:1935).
8280f20d70SHarlanC      -t, --rtsp <port>     Specify the rtsp listening port.(e.g.:554).
8380f20d70SHarlanC      -w, --webrtc <port>   Specify the whip/whep listening port.(e.g.:8900).
8452b80a3cSHarlan      -f, --httpflv <port>  Specify the HTTP-FLV listening port(e.g.:8080).
8552b80a3cSHarlan      -s, --hls <port>      Specify the HLS listening port(e.g.:8081).
8652b80a3cSHarlan      -l, --log <level>     Specify the log level. [possible values: trace, debug, info, warn, error, debug]
8752b80a3cSHarlan      -h, --help            Print help
8852b80a3cSHarlan      -V, --version         Print version
89190df0f9SHarlanC
90190df0f9SHarlanC### 源码编译安装
91190df0f9SHarlanC
92190df0f9SHarlanC#### 克隆 Xiu
93190df0f9SHarlanC
94190df0f9SHarlanC    git clone https://github.com/harlanc/xiu.git
95190df0f9SHarlanC Checkout最新发布的版本代码:
96190df0f9SHarlanC
97190df0f9SHarlanC    git checkout tags/<tag_name> -b <branch_name>
98190df0f9SHarlanC
99190df0f9SHarlanC#### 编译
10006c50324SHarlan为了编译方便,把cargo相关的编译命令封装到了makefle中,使用下面的命令进行编译:
101190df0f9SHarlanC
10206c50324SHarlan- 使用make local编译本地代码:
10306c50324SHarlan
104a09d30c0SHarlan        make local && make build
10506c50324SHarlan- 使用make online拉取线上crates仓库代码进行编译
10606c50324SHarlan
107a09d30c0SHarlan        make online && make build
10806c50324SHarlan
10906c50324SHarlan
110190df0f9SHarlanC#### 运行
111190df0f9SHarlanC
11206c50324SHarlan    cd ./xiu/target/release or ./xiu/target/debug
11352b80a3cSHarlan    ./xiu -h
114190df0f9SHarlanC
11552b80a3cSHarlan## CLI
11652b80a3cSHarlan
11752b80a3cSHarlan#### 说明
11852b80a3cSHarlan
11952b80a3cSHarlan可以使用配置文件或者在命令行对服务进行配置。比如:
12052b80a3cSHarlan
12152b80a3cSHarlan##### 通过配置文件进行配置
12252b80a3cSHarlan
12352b80a3cSHarlan    xiu -c configuration_file_path
12452b80a3cSHarlan
12552b80a3cSHarlan##### 通过命令行
12652b80a3cSHarlan
127b36cf5daSHarlan    xiu -r 1935 -t 5544 -f 8080 -s 8081 -l info
12852b80a3cSHarlan
12952b80a3cSHarlan
13052b80a3cSHarlan#### 配置文件说明
131190df0f9SHarlanC
132190df0f9SHarlanC##### RTMP
133190df0f9SHarlanC    [rtmp]
134190df0f9SHarlanC    enabled = true
135190df0f9SHarlanC    port = 1935
136190df0f9SHarlanC
137190df0f9SHarlanC    # pull streams from other server node.
138190df0f9SHarlanC    [rtmp.pull]
139190df0f9SHarlanC    enabled = false
140190df0f9SHarlanC    address = "192.168.0.1"
141190df0f9SHarlanC    port = 1935
142190df0f9SHarlanC
143190df0f9SHarlanC    # push streams to other server node.
144190df0f9SHarlanC    [[rtmp.push]]
145190df0f9SHarlanC    enabled = true
146190df0f9SHarlanC    address = "localhost"
147190df0f9SHarlanC    port = 1936
148190df0f9SHarlanC    [[rtmp.push]]
149190df0f9SHarlanC    enabled = true
150190df0f9SHarlanC    address = "192.168.0.3"
151190df0f9SHarlanC    port = 1935
152190df0f9SHarlanC
153b36cf5daSHarlan##### RTSP
154b36cf5daSHarlan    [rtsp]
155b36cf5daSHarlan    enabled = false
156b36cf5daSHarlan    port = 5544
157b36cf5daSHarlan
158190df0f9SHarlanC##### HTTPFLV
159190df0f9SHarlanC
160190df0f9SHarlanC    [httpflv]
161190df0f9SHarlanC    # true or false to enable or disable the feature
162190df0f9SHarlanC    enabled = true
163190df0f9SHarlanC    # listening port
164190df0f9SHarlanC    port = 8081
165190df0f9SHarlanC
166190df0f9SHarlanC##### HLS
167190df0f9SHarlanC    [hls]
168190df0f9SHarlanC    # true or false to enable or disable the feature
169190df0f9SHarlanC    enabled = true
170190df0f9SHarlanC    # listening port
171190df0f9SHarlanC    port = 8080
172b754b692SHarlan    # need record the live stream or not
173b754b692SHarlan    need_record = true
174190df0f9SHarlanC
175190df0f9SHarlanC##### Log
176190df0f9SHarlanC
177190df0f9SHarlanC    [log]
178190df0f9SHarlanC    level = "info"
179849cf4fdSHarlan    [log.file]
180849cf4fdSHarlan    # 打开或者关闭输出日志到文件(注意:输出日志到控制台和文件只能2选1).
181849cf4fdSHarlan    enabled = true
182849cf4fdSHarlan    # set the rotate
183849cf4fdSHarlan    rotate = "hour" #[day,hour,minute]
184849cf4fdSHarlan    # set the path where the logs are saved
185849cf4fdSHarlan    path = "./logs"
186190df0f9SHarlanC
18744830bbfSHarlanC### 一些配置的例子
18844830bbfSHarlanC
18944830bbfSHarlanC有一些现成的配置文件放在下面的目录:
19044830bbfSHarlanC
19144830bbfSHarlanC    xiu/application/xiu/src/config
19244830bbfSHarlanC
19344830bbfSHarlanC包括4个配置文件:
19444830bbfSHarlanC
19544830bbfSHarlanC    config_rtmp.toml //只打开rtmp
19644830bbfSHarlanC    config_rtmp_hls.toml //打开 rtmp 和 hls
19744830bbfSHarlanC    config_rtmp_httpflv.toml //打开 rtmp 和 httpflv
19844830bbfSHarlanC    config_rtmp_httpflv_hls.toml //打开所有的 3 个协议
199190df0f9SHarlanC
200190df0f9SHarlanC
201190df0f9SHarlanC
202190df0f9SHarlanC## 应用场景
203190df0f9SHarlanC
204190df0f9SHarlanC##### 推流
205190df0f9SHarlanC
206b36cf5daSHarlan###### RTMP推流
207b36cf5daSHarlan
208190df0f9SHarlanC可以用任何推流软件或者命令工具来推RTMP流,比如使用OBS或者用ffmpeg命令行:
209190df0f9SHarlanC
210fabc9e20SHarlanC    ffmpeg -re -stream_loop -1 -i test.mp4 -c:a copy -c:v copy -f flv -flvflags no_duration_filesize rtmp://127.0.0.1:1935/live/test
211190df0f9SHarlanC
212b36cf5daSHarlan###### RTSP推流
213b36cf5daSHarlan
214b36cf5daSHarlan-  基于TCP推流(Interleaved mode)
215b36cf5daSHarlan
216b36cf5daSHarlan        ffmpeg -re -stream_loop -1  -i test.mp4 -c:v copy  -c:a copy  -rtsp_transport tcp   -f rtsp rtsp://127.0.0.1:5544/live/test
217b36cf5daSHarlan
218b36cf5daSHarlan- 基于UDP推流
219b36cf5daSHarlan
220b36cf5daSHarlan        ffmpeg -re -stream_loop -1  -i test.mp4 -c:v copy  -c:a copy     -f rtsp rtsp://127.0.0.1:5544/live/test
221190df0f9SHarlanC
22280f20d70SHarlanC###### 使用Whip协议推送RTC流
22380f20d70SHarlanC
22480f20d70SHarlanCOBS(3.0或者更高版本)支持whip协议,按照如下配置推流:
22580f20d70SHarlanC
22680f20d70SHarlanC![](https://github-production-user-asset-6210df.s3.amazonaws.com/10411078/271836332-39238b1a-d6e0-4059-bbf3-02ee298df8e7.png)
22780f20d70SHarlanC
228190df0f9SHarlanC##### 播放
229190df0f9SHarlanC
230b36cf5daSHarlan使用ffplay来播放 rtmp/rtsp/httpflv/hls协议的直播流:
231190df0f9SHarlanC
232190df0f9SHarlanC    ffplay -i rtmp://localhost:1935/live/test
233b36cf5daSHarlan    ffplay -i rtsp://127.0.0.1:5544/live/test
234b36cf5daSHarlan    ffplay -rtsp_transport tcp -i rtsp://127.0.0.1:5544/live/test
235190df0f9SHarlanC    ffplay -i http://localhost:8081/live/test.flv
236190df0f9SHarlanC    ffplay -i http://localhost:8080/live/test/test.m3u8
237190df0f9SHarlanC
23880f20d70SHarlanC- 如何播放RTC流(使用Whep协议)
23980f20d70SHarlanC
24080f20d70SHarlanC  1. 把xiu/protocol/webrtc/src/clients/目录下的文件拷贝到xiu可执行文件同级目录下;
24180f20d70SHarlanC  2. 在浏览器中打开地址:http://localhost:890024280f20d70SHarlanC  3. 输入和推流地址相对应的app name和stream name;
24380f20d70SHarlanC  4. 点击Start WHEP进行播放.
24480f20d70SHarlanC
24580f20d70SHarlanC![image](https://github.com/harlanc/xiu/assets/10411078/a6e1317f-0ad0-4f98-8b79-5ed8c96741f7)
24680f20d70SHarlanC
247190df0f9SHarlanC##### 转发 - 静态转推
248190df0f9SHarlanC
249190df0f9SHarlanC应用场景为边缘节点的直播流被转推到源站,配置如下:
250190df0f9SHarlanC
251190df0f9SHarlanC边缘节点的配置文件config_push.toml:
252190df0f9SHarlanC
253190df0f9SHarlanC    [rtmp]
254190df0f9SHarlanC    enabled = true
255190df0f9SHarlanC    port = 1935
256190df0f9SHarlanC    [[rtmp.push]]
257190df0f9SHarlanC    enabled = true
258190df0f9SHarlanC    address = "localhost"
259190df0f9SHarlanC    port = 1936
260190df0f9SHarlanC
261190df0f9SHarlanC源站节点的配置文件config.toml:
262190df0f9SHarlanC
263190df0f9SHarlanC    [rtmp]
264190df0f9SHarlanC    enabled = true
265190df0f9SHarlanC    port = 1936
266190df0f9SHarlanC
267190df0f9SHarlanC启动两个服务:
268190df0f9SHarlanC
269190df0f9SHarlanC    ./xiu config.toml
270190df0f9SHarlanC    ./xiu config_push.toml
271190df0f9SHarlanC
272190df0f9SHarlanC将一路RTMP直播流推送到边缘节点,此直播流会被自动转推到源站,可以同时播放源站或者边缘节点的直播流:
273190df0f9SHarlanC
274190df0f9SHarlanC    ffplay -i rtmp://localhost:1935/live/test
275190df0f9SHarlanC    ffplay -i rtmp://localhost:1936/live/test
276190df0f9SHarlanC
277190df0f9SHarlanC
278190df0f9SHarlanC
279190df0f9SHarlanC##### 转发 - 静态回源
280190df0f9SHarlanC
281190df0f9SHarlanC应用场景为播放过程中用户从边缘节点拉流,边缘节点无此流,则回源拉流,配置文件如下:
282190df0f9SHarlanC
283190df0f9SHarlanC源站节点的配置文件为 config.toml:
284190df0f9SHarlanC
285190df0f9SHarlanC    [rtmp]
286190df0f9SHarlanC    enabled = true
287190df0f9SHarlanC    port = 1935
288190df0f9SHarlanC
289190df0f9SHarlanC
290190df0f9SHarlanC边缘节点的配置文件为 config_pull.toml:
291190df0f9SHarlanC
292190df0f9SHarlanC    [rtmp]
293190df0f9SHarlanC    enabled = true
294190df0f9SHarlanC    port = 1936
295190df0f9SHarlanC    [rtmp.pull]
296190df0f9SHarlanC    enabled = false
297190df0f9SHarlanC    address = "localhost"
298190df0f9SHarlanC    port = 1935
299190df0f9SHarlanC
300190df0f9SHarlanC运行两个服务:
301190df0f9SHarlanC
302190df0f9SHarlanC    ./xiu config.toml
303190df0f9SHarlanC    ./xiu config_pull.toml
304190df0f9SHarlanC
305190df0f9SHarlanC直接将直播流推送到源站,到边缘节点请求此路直播流,边缘节点会回源拉流,可以同时播放边缘和源站节点上的直播流:
306190df0f9SHarlanC
307190df0f9SHarlanC    ffplay -i rtmp://localhost:1935/live/test
308190df0f9SHarlanC    ffplay -i rtmp://localhost:1936/live/test
309190df0f9SHarlanC
310190df0f9SHarlanC## Star History
311190df0f9SHarlanC
31280f20d70SHarlanC[![Star History Chart](https://api.star-history.com/svg?repos=harlanc/xiu&type=Date)](https://star-history.com/#harlanc/xiu)
31380f20d70SHarlanC
314190df0f9SHarlanC
315190df0f9SHarlanC## 鸣谢
316190df0f9SHarlanC
317190df0f9SHarlanC - [media_server](https://github.com/ireader/media-server.git)
318190df0f9SHarlanC
319190df0f9SHarlanC## 其它
320190df0f9SHarlanC
32137a05031SHarlanC有任何问题请在issues提问,欢迎star和提pull request。你的关注可以让此项目走的更快更远。
322190df0f9SHarlanC
323