![XIU](https://img.shields.io/:XIU-blue.svg)[![crates.io](https://img.shields.io/crates/v/xiu.svg)](https://crates.io/crates/xiu) [![crates.io](https://img.shields.io/crates/d/xiu.svg)](https://crates.io/crates/xiu) ![RTMP](https://img.shields.io/:RTMP-blue.svg)[![crates.io](https://img.shields.io/crates/v/rtmp.svg)](https://crates.io/crates/rtmp) [![crates.io](https://img.shields.io/crates/d/rtmp.svg)](https://crates.io/crates/rtmp) ![RTSP](https://img.shields.io/:RTSP-blue.svg)[![crates.io](https://img.shields.io/crates/v/xrtsp.svg)](https://crates.io/crates/xrtsp) [![crates.io](https://img.shields.io/crates/d/xrtsp.svg)](https://crates.io/crates/xrtsp) ![WEBRTC](https://img.shields.io/:WEBRTC-blue.svg)[![crates.io](https://img.shields.io/crates/v/xwebrtc.svg)](https://crates.io/crates/xwebrtc) [![crates.io](https://img.shields.io/crates/d/xwebrtc.svg)](https://crates.io/crates/xwebrtc) ![HTTPFLV](https://img.shields.io/:HTTPFLV-blue.svg)[![crates.io](https://img.shields.io/crates/v/httpflv.svg)](https://crates.io/crates/httpflv) [![crates.io](https://img.shields.io/crates/d/httpflv.svg)](https://crates.io/crates/httpflv) ![HLS](https://img.shields.io/:HLS-blue.svg)[![crates.io](https://img.shields.io/crates/v/hls.svg)](https://crates.io/crates/hls) [![crates.io](https://img.shields.io/crates/d/hls.svg)](https://crates.io/crates/hls) ![FLV](https://img.shields.io/:FLV-blue.svg)[![crates.io](https://img.shields.io/crates/v/xflv.svg)](https://crates.io/crates/xflv) [![crates.io](https://img.shields.io/crates/d/xflv.svg)](https://crates.io/crates/xflv) ![MPEGTS](https://img.shields.io/:MPEGTS-blue.svg)[![crates.io](https://img.shields.io/crates/v/xmpegts.svg)](https://crates.io/crates/xmpegts) [![crates.io](https://img.shields.io/crates/d/xmpegts.svg)](https://crates.io/crates/xmpegts) [![](https://app.travis-ci.com/harlanc/xiu.svg?branch=master)](https://app.travis-ci.com/github/harlanc/xiu) [![](https://img.shields.io/discord/894502149764034560?logo=discord)](https://discord.gg/gS5wBRtpcB) ![wechat](https://img.shields.io/:微信-harlancc-blue.svg) [中文文档](https://github.com/harlanc/xiu/blob/master/README_CN.md) Xiu is a simple,high performance and secure live media server written in pure Rust, it now supports popular live protocols like RTMP[cluster]/RTSP/WebRTC[Whip/Whep]/HLS/HTTP-FLV. ## Features - [x] Support multiple platforms(Linux/MacOS/Windows). - [x] Support RTMP. - [x] Support publishing or subscribing H.264/AAC streams. - [x] Support GOP cache which can be configured in the configuration file. - [x] Support protocol conversion from RTMP to HTTP-FLV/HLS. - [x] Support cluster. - [x] Support RTSP. - [x] Support publishing or subscribing H.265/H.264/AAC stream over both TCP(Interleaved) and UDP. - [x] Support protocol conversion from RTSP to RTMP/HLS/HTTP-FLV. - [x] Support WebRTC(Whip/Whep). - [x] Support publishing rtc stream using Whip. - [x] Support subscribing rtc stream using Whep. - [x] Support HTTP-FLV/HLS protocols(Transferred from RTMP/RTSP). - [x] Support configuring the service using command line or a configuration file. - [x] Support HTTP API/Notifications. - [x] Support querying stream information. - [x] Support notification of stream status. - [x] Support token authentications. - [x] Support recording live streams into HLS files(m3u8+ts). ## Preparation #### Install Rust and Cargo [Document](https://doc.rust-lang.org/cargo/getting-started/installation.html) ## Install and run There are two ways to install xiu : - Using cargo to install - Building from source ### Install using cargo Issue the following command to install xiu: cargo install xiu Start the service with the following command to get help: xiu -h A secure and easy to use live media server, hope you love it!!! Usage: xiu [OPTIONS] Options: -c, --config Specify the xiu server configuration file path. -r, --rtmp Specify the RTMP listening port(e.g.:1935). -t, --rtsp Specify the rtsp listening port.(e.g.:5544). -w, --webrtc Specify the whip/whep listening port.(e.g.:8900). -f, --httpflv Specify the HTTP-FLV listening port(e.g.:8080). -s, --hls Specify the HLS listening port(e.g.:8081). -l, --log Specify the log level. [possible values: trace, debug, info, warn, error, debug] -h, --help Print help. -V, --version Print version. ### Build from souce #### Clone Xiu git clone https://github.com/harlanc/xiu.git use master branch #### Build We use makefile to build xiu and revelant libraries. - Using make local to build local source codes: make local && make build - Using make online to pull the online crates codes and build: make online && make build #### Run cd ./xiu/target/release or ./xiu/target/debug ./xiu -h ## CLI #### Instructions You can use command line to configure the xiu server easily. You can specify to configure xiu using configuration file or from the command lines. ##### Configure using file xiu -c configuration_file_path ##### Configure using command line xiu -r 1935 -t 5544 -f 8080 -s 8081 -l info #### How to Configure the configuration file ##### RTMP [rtmp] enabled = true port = 1935 # pull streams from other server node. [rtmp.pull] enabled = false address = "192.168.0.1" port = 1935 # push streams to other server node. [[rtmp.push]] enabled = true address = "localhost" port = 1936 [[rtmp.push]] enabled = true address = "192.168.0.3" port = 1935 ##### RTSP [rtsp] enabled = false port = 5544 ##### WebRTC(Whip/Whep) [webrtc] enabled = false port = 8900 ##### HTTPFLV [httpflv] # true or false to enable or disable the feature enabled = true # listening port port = 8080 ##### HLS [hls] # true or false to enable or disable the feature enabled = true # listening port port = 8081 # need record the live stream or not need_record = true ##### Log [log] level = "info" [log.file] # write log to file or not(Writing logs to file or console cannot be satisfied at the same time). enabled = true # set the rotate rotate = "hour" #[day,hour,minute] # set the path where the logs are saved path = "./logs" ### Configuration examples I edit some configuration files under the following path which can be used directly: xiu/application/xiu/src/config It contains the following 4 files: config_rtmp.toml //enable rtmp only config_rtmp_hls.toml //enable rtmp and hls config_rtmp_httpflv.toml //enable rtmp and httpflv config_rtmp_httpflv_hls.toml //enable all the 3 protocols ## Scenarios ##### Push ###### Push RTMP You can use two ways: - Use OBS to push a live rtmp stream - Or use FFmpeg to push a rtmp stream: 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 ###### Push RTSP - Over TCP(Interleaved mode) 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 - Over UDP ffmpeg -re -stream_loop -1 -i test.mp4 -c:v copy -c:a copy -f rtsp rtsp://127.0.0.1:5544/live/test ###### Push RTC(Whip) Now OBS (version 3.0 or above) can support whip output. The configurations are as follows: ![](https://github-production-user-asset-6210df.s3.amazonaws.com/10411078/271836332-39238b1a-d6e0-4059-bbf3-02ee298df8e7.png) ##### Play Use ffplay to play the rtmp/rtsp/httpflv/hls live stream: ffplay -i rtmp://localhost:1935/live/test ffplay -i rtsp://127.0.0.1:5544/live/test ffplay -rtsp_transport tcp -i rtsp://127.0.0.1:5544/live/test ffplay -i http://localhost:8080/live/test.flv ffplay -i http://localhost:8081/live/test/test.m3u8 - How to play WebRTC stream*(Whep) 1. Copy the files under xiu/protocol/webrtc/src/clients/ folder to the same level directory of the binary file xiu. 2. Open the address http://localhost:8900 in the browser. 3. Enter the app name and stream name corresponding to the OBS whip publish address. 4. Click Start WHEP(After OBS publish) to play the RTC stream. ![image](https://github.com/harlanc/xiu/assets/10411078/a6e1317f-0ad0-4f98-8b79-5ed8c96741f7) ##### Relay - Static push The configuration files are as follows: The configuration file of Service 1 named config.toml: [rtmp] enabled = true port = 1935 [[rtmp.push]] enabled = true address = "localhost" port = 1936 The configuration file of Service 2 named config_push.toml: [rtmp] enabled = true port = 1936 Run the 2 services: ./xiu config.toml ./xiu config_push.toml Use the above methods to push rtmp live stream to service 1, then the stream can be pushed to service 2 automatically, you can play the same live stream from both the two services: ffplay -i rtmp://localhost:1935/live/test ffplay -i rtmp://localhost:1936/live/test ##### Relay - Static pull The configuration file are as follows: The configuration file of Service 1 named config.toml: [rtmp] enabled = true port = 1935 The configuration file of Service 2 named config_pull.toml: [rtmp] enabled = true port = 1936 [rtmp.pull] enabled = false address = "localhost" port = 1935 Run the 2 services: ./xiu config.toml ./xiu config_pull.toml Use the above methods to push live stream to service 1, when you play the stream from serivce 2, it will pull the stream from service 1: ffplay -i rtmp://localhost:1935/live/test ffplay -i rtmp://localhost:1936/live/test ## Star History [![Star History Chart](https://api.star-history.com/svg?repos=harlanc/xiu&type=Date)](https://star-history.com/#harlanc/xiu) ## Thanks - [media_server](https://github.com/ireader/media-server.git) ## Others Open issues if you have any problems. Star and pull requests are welcomed. Your stars can make this project go faster and further.