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[](https://crates.io/crates/xiu) 7888fa685SHarlanC[](https://crates.io/crates/xiu) 8888fa685SHarlanC[](https://crates.io/crates/rtmp) 9888fa685SHarlanC[](https://crates.io/crates/rtmp) 1080f20d70SHarlanC[](https://crates.io/crates/xrtsp) 1180f20d70SHarlanC[](https://crates.io/crates/xrtsp) 1280f20d70SHarlanC[](https://crates.io/crates/xwebrtc) 1380f20d70SHarlanC[](https://crates.io/crates/xwebrtc) 14888fa685SHarlanC[](https://crates.io/crates/httpflv) 15888fa685SHarlanC[](https://crates.io/crates/httpflv) 16888fa685SHarlanC[](https://crates.io/crates/hls) 17888fa685SHarlanC[](https://crates.io/crates/hls) 18888fa685SHarlanC[](https://crates.io/crates/xflv) 19888fa685SHarlanC[](https://crates.io/crates/xflv) 20888fa685SHarlanC[](https://crates.io/crates/xmpegts) 21888fa685SHarlanC[](https://crates.io/crates/xmpegts) 22190df0f9SHarlanC[](https://app.travis-ci.com/github/harlanc/xiu) 23a45f3c5dSwawacry[](https://discord.gg/gS5wBRtpcB) 24a45f3c5dSwawacry 25190df0f9SHarlanC 26190df0f9SHarlanC 2780f20d70SHarlanCXIU是用纯Rust开发的一款简单和安全的流媒体服务器,目前支持的流媒体协议包括RTMP[cluster]/RTSP/WebRTC[Whip/Whep]/HLS/HTTPFLV。 28190df0f9SHarlanC 29190df0f9SHarlanC## 功能 30190df0f9SHarlanC 31b36cf5daSHarlan- [x] 支持多平台(Linux/Mac/Windows) 32b36cf5daSHarlan- [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/Whep) 4180f20d70SHarlanC - [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 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:8900; 24280f20d70SHarlanC 3. 输入和推流地址相对应的app name和stream name; 24380f20d70SHarlanC 4. 点击Start WHEP进行播放. 24480f20d70SHarlanC 24580f20d70SHarlanC 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[](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