用純RUST手擼一個開源流媒體服務(RTMP/HTTPFLV/HLS)XIU

HarlanC發表於2022-04-01

用純RUST手擼一個開源流媒體服務(RTMP/HTTPFLV/HLS)XIU

作者工作目前在音視訊流媒體行業,用了大概一年的業餘時間學習Rust,並且實現了一個簡單的音視訊流媒體服務,雖然據說Rust已經連續多年被評為最受程式設計師喜歡的語言,但是在國內還是比較冷門,作者比較看好Rust的未來,如果你也對Rust感興趣,同時也對音視訊感興趣,推薦你看看這個專案,下面是專案介紹:

XIU是用純Rust開發的一款簡單和安全的流媒體伺服器,目前支援流行的三大流媒體協議包括RTMP/HLS/HTTPFLV(將來有可能支援其它協議),可以單點部署,也可以用relay功能來部署叢集。

功能

  • RTMP
    • 釋出直播流和播放直播流
    • 轉發:靜態轉推和靜態回源
  • HTTPFLV
  • HLS

準備工作

安裝 Rust and Cargo

Document

安裝和執行

有兩種方式來安裝xiu:

  • 直接用cargo來安裝
  • 原始碼編譯安裝

用cargo命令安裝

執行下面的命令來安轉xiu:

cargo install xiu

執行下面的命令來啟動服務:

xiu configuration_file_path/config.toml

原始碼編譯安裝

克隆 Xiu

git clone https://github.com/harlanc/xiu.git

Checkout最新發布的版本程式碼:

    git checkout tags/<tag_name> -b <branch_name>

編譯

cd ./xiu/application/xiu
cargo build --release

執行

cd ./xiu/target/release
./xiu config.toml

配置

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
HTTPFLV
[httpflv]
# true or false to enable or disable the feature
enabled = true
# listening port
port = 8081
HLS
[hls]
# true or false to enable or disable the feature
enabled = true
# listening port
port = 8080
Log
[log]
level = "info"

一些配置的例子

有一些現成的配置檔案放在下面的目錄:

xiu/application/xiu/src/config

包括4個配置檔案:

config_rtmp.toml //只開啟rtmp
config_rtmp_hls.toml //開啟 rtmp 和 hls
config_rtmp_httpflv.toml //開啟 rtmp 和 httpflv
config_rtmp_httpflv_hls.toml //開啟所有的 3 個協議

應用場景

推流

可以用任何推流軟體或者命令工具來推RTMP流,比如使用OBS或者用ffmpeg命令列:

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
播放

使用ffplay來播放 rtmp/httpflv/hls協議的直播流:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i http://localhost:8081/live/test.flv
ffplay -i http://localhost:8080/live/test/test.m3u8
轉發 - 靜態轉推

應用場景為邊緣節點的直播流被轉推到源站,配置如下:

邊緣節點的配置檔案config_push.toml:

[rtmp]
enabled = true
port = 1935
[[rtmp.push]]
enabled = true
address = "localhost"
port = 1936

源站節點的配置檔案config.toml:

[rtmp]
enabled = true
port = 1936

啟動兩個服務:

./xiu config.toml
./xiu config_push.toml

將一路RTMP直播流推送到邊緣節點,此直播流會被自動轉推到源站,可以同時播放源站或者邊緣節點的直播流:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i rtmp://localhost:1936/live/test
轉發 - 靜態回源

應用場景為播放過程中使用者從邊緣節點拉流,邊緣節點無此流,則回源拉流,配置檔案如下:

源站節點的配置檔案為 config.toml:

[rtmp]
enabled = true
port = 1935

邊緣節點的配置檔案為 config_pull.toml:

[rtmp]
enabled = true
port = 1936
[rtmp.pull]
enabled = false
address = "localhost"
port = 1935

執行兩個服務:

./xiu config.toml
./xiu config_pull.toml

直接將直播流推送到源站,到邊緣節點請求此路直播流,邊緣節點會回源拉流,可以同時播放邊緣和源站節點上的直播流:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i rtmp://localhost:1936/live/test

Star History

link

鳴謝

其它

有任何問題請在issues提問,歡迎star和提pull request。你的關注可以讓此專案走的更快更遠。

相關文章