Repository files navigation

GMS (Guac Media Server)

GMS is a simple, high performance and secure live media server written in pure Rust. It supports popular live protocols like RTMP/HLS/LL-HLS/HTTP-FLV. You can deploy it as a stand-alone server or a cluster using the relay feature.

Features

  • Support multiple platforms(Linux/MacOS/Windows).
  • Support RTMP as a stand-alone server or cluster(RTMP relay).
    • Support GOP cache which can be configured in the configuration file.
  • Support HTTP-FLV/HLS protocols(Transferred from RTMP).
  • Support configuring the service using command line or a configuration file.
  • Support HTTP API/Notifications.
    • Support querying stream information.
    • Support notify stream status.

Preparation

Install Rust and Cargo

Document

Install and run

There are two ways to install gms:

  • Using cargo to install
  • Building from source

Install using cargo

Issue the following command to install gms:

cargo install gms

Start the service with the following command to get help:

gms -h
A secure and easy to use live media server
Usage: gms [OPTIONS] <--config <path>|--rtmp <port>>
Options:
-c, --config <path> Specify the gms server configuration file path.
-r, --rtmp <port> Specify the RTMP listening port(e.g.:1935).
-f, --httpflv <port> Specify the HTTP-FLV listening port(e.g.:8080).
-s, --hls <port> Specify the HLS listening port(e.g.:8081).
-l, --log <level> Specify the log level. [possible values: trace, debug, info, warn, error, debug]
-h, --help Print help
-V, --version Print version

Build from source

Clone gms

git clone https://github.com/guaclive/gms.git

Build

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

Run

cd ./gms/target/release
./gms -h

CLI

Instructions

You can use command line to configure the gms server easily. You can specify to configure gms using configuration file or from the command lines.

Configure using file
gms -c configuration_file_path
Configure using command line
gms -r 1935 -f 8080 -s 8081 -l info

How to Configure the configuration file

RTMP
[rtmp]
enabled = true
port = 1935
# send webhook on publish and publish done
[rtmp.webhooks]
enabled = true
publish_url = "http://localhost:8080/api/v1/publish"
publish_done_url = "http://localhost:8080/api/v1/publish_done"
# 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"
[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:

gms/application/gms/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

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
Play

Use ffplay to play the rtmp/httpflv/hls live stream:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i http://localhost:8081/live/test.flv
ffplay -i http://localhost:8080/live/test/test.m3u8
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:

./gms config.toml
./gms 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:

./gms config.toml
./gms 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

Thanks

Others

Open issues if you have any problems. Star and pull requests are welcomed. Your stars can make this project go faster and further.

About

A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

GMS (Guac Media Server)

GMS is a simple, high performance and secure live media server written in pure Rust. It supports popular live protocols like RTMP/HLS/LL-HLS/HTTP-FLV. You can deploy it as a stand-alone server or a cluster using the relay feature.

Features

  • Support multiple platforms(Linux/MacOS/Windows).
  • Support RTMP as a stand-alone server or cluster(RTMP relay).
    • Support GOP cache which can be configured in the configuration file.
  • Support HTTP-FLV/HLS protocols(Transferred from RTMP).
  • Support configuring the service using command line or a configuration file.
  • Support HTTP API/Notifications.
    • Support querying stream information.
    • Support notify stream status.

Preparation

Install Rust and Cargo

Document

Install and run

There are two ways to install gms:

  • Using cargo to install
  • Building from source

Install using cargo

Issue the following command to install gms:

cargo install gms

Start the service with the following command to get help:

gms -h
A secure and easy to use live media server
Usage: gms [OPTIONS] <--config <path>|--rtmp <port>>
Options:
-c, --config <path> Specify the gms server configuration file path.
-r, --rtmp <port> Specify the RTMP listening port(e.g.:1935).
-f, --httpflv <port> Specify the HTTP-FLV listening port(e.g.:8080).
-s, --hls <port> Specify the HLS listening port(e.g.:8081).
-l, --log <level> Specify the log level. [possible values: trace, debug, info, warn, error, debug]
-h, --help Print help
-V, --version Print version

Build from source

Clone gms

git clone https://github.com/guaclive/gms.git

Build

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

Run

cd ./gms/target/release
./gms -h

CLI

Instructions

You can use command line to configure the gms server easily. You can specify to configure gms using configuration file or from the command lines.

Configure using file
gms -c configuration_file_path
Configure using command line
gms -r 1935 -f 8080 -s 8081 -l info

How to Configure the configuration file

RTMP
[rtmp]
enabled = true
port = 1935
# send webhook on publish and publish done
[rtmp.webhooks]
enabled = true
publish_url = "http://localhost:8080/api/v1/publish"
publish_done_url = "http://localhost:8080/api/v1/publish_done"
# 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"
[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:

gms/application/gms/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

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
Play

Use ffplay to play the rtmp/httpflv/hls live stream:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i http://localhost:8081/live/test.flv
ffplay -i http://localhost:8080/live/test/test.m3u8
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:

./gms config.toml
./gms 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:

./gms config.toml
./gms 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

Thanks

Others

Open issues if you have any problems. Star and pull requests are welcomed. Your stars can make this project go faster and further.

About

A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GMS (Guac Media Server)

GMS is a simple, high performance and secure live media server written in pure Rust. It supports popular live protocols like RTMP/HLS/LL-HLS/HTTP-FLV. You can deploy it as a stand-alone server or a cluster using the relay feature.

Features

  • Support multiple platforms(Linux/MacOS/Windows).
  • Support RTMP as a stand-alone server or cluster(RTMP relay).
    • Support GOP cache which can be configured in the configuration file.
  • Support HTTP-FLV/HLS protocols(Transferred from RTMP).
  • Support configuring the service using command line or a configuration file.
  • Support HTTP API/Notifications.
    • Support querying stream information.
    • Support notify stream status.

Preparation

Install Rust and Cargo

Document

Install and run

There are two ways to install gms:

  • Using cargo to install
  • Building from source

Install using cargo

Issue the following command to install gms:

cargo install gms

Start the service with the following command to get help:

gms -h
A secure and easy to use live media server
Usage: gms [OPTIONS] <--config <path>|--rtmp <port>>
Options:
-c, --config <path> Specify the gms server configuration file path.
-r, --rtmp <port> Specify the RTMP listening port(e.g.:1935).
-f, --httpflv <port> Specify the HTTP-FLV listening port(e.g.:8080).
-s, --hls <port> Specify the HLS listening port(e.g.:8081).
-l, --log <level> Specify the log level. [possible values: trace, debug, info, warn, error, debug]
-h, --help Print help
-V, --version Print version

Build from source

Clone gms

git clone https://github.com/guaclive/gms.git

Build

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

Run

cd ./gms/target/release
./gms -h

CLI

Instructions

You can use command line to configure the gms server easily. You can specify to configure gms using configuration file or from the command lines.

Configure using file
gms -c configuration_file_path
Configure using command line
gms -r 1935 -f 8080 -s 8081 -l info

How to Configure the configuration file

RTMP
[rtmp]
enabled = true
port = 1935
# send webhook on publish and publish done
[rtmp.webhooks]
enabled = true
publish_url = "http://localhost:8080/api/v1/publish"
publish_done_url = "http://localhost:8080/api/v1/publish_done"
# 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"
[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:

gms/application/gms/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

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
Play

Use ffplay to play the rtmp/httpflv/hls live stream:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i http://localhost:8081/live/test.flv
ffplay -i http://localhost:8080/live/test/test.m3u8
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:

./gms config.toml
./gms 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:

./gms config.toml
./gms 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

Thanks

Others

Open issues if you have any problems. Star and pull requests are welcomed. Your stars can make this project go faster and further.

About

A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GMS (Guac Media Server)

GMS is a simple, high performance and secure live media server written in pure Rust. It supports popular live protocols like RTMP/HLS/LL-HLS/HTTP-FLV. You can deploy it as a stand-alone server or a cluster using the relay feature.

Features

  • Support multiple platforms(Linux/MacOS/Windows).
  • Support RTMP as a stand-alone server or cluster(RTMP relay).
    • Support GOP cache which can be configured in the configuration file.
  • Support HTTP-FLV/HLS protocols(Transferred from RTMP).
  • Support configuring the service using command line or a configuration file.
  • Support HTTP API/Notifications.
    • Support querying stream information.
    • Support notify stream status.

Preparation

Install Rust and Cargo

Document

Install and run

There are two ways to install gms:

  • Using cargo to install
  • Building from source

Install using cargo

Issue the following command to install gms:

cargo install gms

Start the service with the following command to get help:

gms -h
A secure and easy to use live media server
Usage: gms [OPTIONS] <--config <path>|--rtmp <port>>
Options:
-c, --config <path> Specify the gms server configuration file path.
-r, --rtmp <port> Specify the RTMP listening port(e.g.:1935).
-f, --httpflv <port> Specify the HTTP-FLV listening port(e.g.:8080).
-s, --hls <port> Specify the HLS listening port(e.g.:8081).
-l, --log <level> Specify the log level. [possible values: trace, debug, info, warn, error, debug]
-h, --help Print help
-V, --version Print version

Build from source

Clone gms

git clone https://github.com/guaclive/gms.git

Build

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

Run

cd ./gms/target/release
./gms -h

CLI

Instructions

You can use command line to configure the gms server easily. You can specify to configure gms using configuration file or from the command lines.

Configure using file
gms -c configuration_file_path
Configure using command line
gms -r 1935 -f 8080 -s 8081 -l info

How to Configure the configuration file

RTMP
[rtmp]
enabled = true
port = 1935
# send webhook on publish and publish done
[rtmp.webhooks]
enabled = true
publish_url = "http://localhost:8080/api/v1/publish"
publish_done_url = "http://localhost:8080/api/v1/publish_done"
# 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"
[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:

gms/application/gms/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

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
Play

Use ffplay to play the rtmp/httpflv/hls live stream:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i http://localhost:8081/live/test.flv
ffplay -i http://localhost:8080/live/test/test.m3u8
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:

./gms config.toml
./gms 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:

./gms config.toml
./gms 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

Thanks

Others

Open issues if you have any problems. Star and pull requests are welcomed. Your stars can make this project go faster and further.

About

A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

GMS (Guac Media Server)

GMS is a simple, high performance and secure live media server written in pure Rust. It supports popular live protocols like RTMP/HLS/LL-HLS/HTTP-FLV. You can deploy it as a stand-alone server or a cluster using the relay feature.

Features

  • Support multiple platforms(Linux/MacOS/Windows).
  • Support RTMP as a stand-alone server or cluster(RTMP relay).
    • Support GOP cache which can be configured in the configuration file.
  • Support HTTP-FLV/HLS protocols(Transferred from RTMP).
  • Support configuring the service using command line or a configuration file.
  • Support HTTP API/Notifications.
    • Support querying stream information.
    • Support notify stream status.

Preparation

Install Rust and Cargo

Document

Install and run

There are two ways to install gms:

  • Using cargo to install
  • Building from source

Install using cargo

Issue the following command to install gms:

cargo install gms

Start the service with the following command to get help:

gms -h
A secure and easy to use live media server
Usage: gms [OPTIONS] <--config <path>|--rtmp <port>>
Options:
-c, --config <path> Specify the gms server configuration file path.
-r, --rtmp <port> Specify the RTMP listening port(e.g.:1935).
-f, --httpflv <port> Specify the HTTP-FLV listening port(e.g.:8080).
-s, --hls <port> Specify the HLS listening port(e.g.:8081).
-l, --log <level> Specify the log level. [possible values: trace, debug, info, warn, error, debug]
-h, --help Print help
-V, --version Print version

Build from source

Clone gms

git clone https://github.com/guaclive/gms.git

Build

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

Run

cd ./gms/target/release
./gms -h

CLI

Instructions

You can use command line to configure the gms server easily. You can specify to configure gms using configuration file or from the command lines.

Configure using file
gms -c configuration_file_path
Configure using command line
gms -r 1935 -f 8080 -s 8081 -l info

How to Configure the configuration file

RTMP
[rtmp]
enabled = true
port = 1935
# send webhook on publish and publish done
[rtmp.webhooks]
enabled = true
publish_url = "http://localhost:8080/api/v1/publish"
publish_done_url = "http://localhost:8080/api/v1/publish_done"
# 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"
[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:

gms/application/gms/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

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
Play

Use ffplay to play the rtmp/httpflv/hls live stream:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i http://localhost:8081/live/test.flv
ffplay -i http://localhost:8080/live/test/test.m3u8
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:

./gms config.toml
./gms 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:

./gms config.toml
./gms 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

Thanks

Others

Open issues if you have any problems. Star and pull requests are welcomed. Your stars can make this project go faster and further.

About

A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GMS (Guac Media Server)

GMS is a simple, high performance and secure live media server written in pure Rust. It supports popular live protocols like RTMP/HLS/LL-HLS/HTTP-FLV. You can deploy it as a stand-alone server or a cluster using the relay feature.

Features

  • Support multiple platforms(Linux/MacOS/Windows).
  • Support RTMP as a stand-alone server or cluster(RTMP relay).
    • Support GOP cache which can be configured in the configuration file.
  • Support HTTP-FLV/HLS protocols(Transferred from RTMP).
  • Support configuring the service using command line or a configuration file.
  • Support HTTP API/Notifications.
    • Support querying stream information.
    • Support notify stream status.

Preparation

Install Rust and Cargo

Document

Install and run

There are two ways to install gms:

  • Using cargo to install
  • Building from source

Install using cargo

Issue the following command to install gms:

cargo install gms

Start the service with the following command to get help:

gms -h
A secure and easy to use live media server
Usage: gms [OPTIONS] <--config <path>|--rtmp <port>>
Options:
-c, --config <path> Specify the gms server configuration file path.
-r, --rtmp <port> Specify the RTMP listening port(e.g.:1935).
-f, --httpflv <port> Specify the HTTP-FLV listening port(e.g.:8080).
-s, --hls <port> Specify the HLS listening port(e.g.:8081).
-l, --log <level> Specify the log level. [possible values: trace, debug, info, warn, error, debug]
-h, --help Print help
-V, --version Print version

Build from source

Clone gms

git clone https://github.com/guaclive/gms.git

Build

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

Run

cd ./gms/target/release
./gms -h

CLI

Instructions

You can use command line to configure the gms server easily. You can specify to configure gms using configuration file or from the command lines.

Configure using file
gms -c configuration_file_path
Configure using command line
gms -r 1935 -f 8080 -s 8081 -l info

How to Configure the configuration file

RTMP
[rtmp]
enabled = true
port = 1935
# send webhook on publish and publish done
[rtmp.webhooks]
enabled = true
publish_url = "http://localhost:8080/api/v1/publish"
publish_done_url = "http://localhost:8080/api/v1/publish_done"
# 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"
[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:

gms/application/gms/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

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
Play

Use ffplay to play the rtmp/httpflv/hls live stream:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i http://localhost:8081/live/test.flv
ffplay -i http://localhost:8080/live/test/test.m3u8
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:

./gms config.toml
./gms 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:

./gms config.toml
./gms 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

Thanks

Others

Open issues if you have any problems. Star and pull requests are welcomed. Your stars can make this project go faster and further.

About

A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GMS (Guac Media Server)

GMS is a simple, high performance and secure live media server written in pure Rust. It supports popular live protocols like RTMP/HLS/LL-HLS/HTTP-FLV. You can deploy it as a stand-alone server or a cluster using the relay feature.

Features

  • Support multiple platforms(Linux/MacOS/Windows).
  • Support RTMP as a stand-alone server or cluster(RTMP relay).
    • Support GOP cache which can be configured in the configuration file.
  • Support HTTP-FLV/HLS protocols(Transferred from RTMP).
  • Support configuring the service using command line or a configuration file.
  • Support HTTP API/Notifications.
    • Support querying stream information.
    • Support notify stream status.

Preparation

Install Rust and Cargo

Document

Install and run

There are two ways to install gms:

  • Using cargo to install
  • Building from source

Install using cargo

Issue the following command to install gms:

cargo install gms

Start the service with the following command to get help:

gms -h
A secure and easy to use live media server
Usage: gms [OPTIONS] <--config <path>|--rtmp <port>>
Options:
-c, --config <path> Specify the gms server configuration file path.
-r, --rtmp <port> Specify the RTMP listening port(e.g.:1935).
-f, --httpflv <port> Specify the HTTP-FLV listening port(e.g.:8080).
-s, --hls <port> Specify the HLS listening port(e.g.:8081).
-l, --log <level> Specify the log level. [possible values: trace, debug, info, warn, error, debug]
-h, --help Print help
-V, --version Print version

Build from source

Clone gms

git clone https://github.com/guaclive/gms.git

Build

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

Run

cd ./gms/target/release
./gms -h

CLI

Instructions

You can use command line to configure the gms server easily. You can specify to configure gms using configuration file or from the command lines.

Configure using file
gms -c configuration_file_path
Configure using command line
gms -r 1935 -f 8080 -s 8081 -l info

How to Configure the configuration file

RTMP
[rtmp]
enabled = true
port = 1935
# send webhook on publish and publish done
[rtmp.webhooks]
enabled = true
publish_url = "http://localhost:8080/api/v1/publish"
publish_done_url = "http://localhost:8080/api/v1/publish_done"
# 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"
[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:

gms/application/gms/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

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
Play

Use ffplay to play the rtmp/httpflv/hls live stream:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i http://localhost:8081/live/test.flv
ffplay -i http://localhost:8080/live/test/test.m3u8
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:

./gms config.toml
./gms 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:

./gms config.toml
./gms 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

Thanks

Others

Open issues if you have any problems. Star and pull requests are welcomed. Your stars can make this project go faster and further.

About

A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

GMS (Guac Media Server)

GMS is a simple, high performance and secure live media server written in pure Rust. It supports popular live protocols like RTMP/HLS/LL-HLS/HTTP-FLV. You can deploy it as a stand-alone server or a cluster using the relay feature.

Features

  • Support multiple platforms(Linux/MacOS/Windows).
  • Support RTMP as a stand-alone server or cluster(RTMP relay).
    • Support GOP cache which can be configured in the configuration file.
  • Support HTTP-FLV/HLS protocols(Transferred from RTMP).
  • Support configuring the service using command line or a configuration file.
  • Support HTTP API/Notifications.
    • Support querying stream information.
    • Support notify stream status.

Preparation

Install Rust and Cargo

Document

Install and run

There are two ways to install gms:

  • Using cargo to install
  • Building from source

Install using cargo

Issue the following command to install gms:

cargo install gms

Start the service with the following command to get help:

gms -h
A secure and easy to use live media server
Usage: gms [OPTIONS] <--config <path>|--rtmp <port>>
Options:
-c, --config <path> Specify the gms server configuration file path.
-r, --rtmp <port> Specify the RTMP listening port(e.g.:1935).
-f, --httpflv <port> Specify the HTTP-FLV listening port(e.g.:8080).
-s, --hls <port> Specify the HLS listening port(e.g.:8081).
-l, --log <level> Specify the log level. [possible values: trace, debug, info, warn, error, debug]
-h, --help Print help
-V, --version Print version

Build from source

Clone gms

git clone https://github.com/guaclive/gms.git

Build

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

Run

cd ./gms/target/release
./gms -h

CLI

Instructions

You can use command line to configure the gms server easily. You can specify to configure gms using configuration file or from the command lines.

Configure using file
gms -c configuration_file_path
Configure using command line
gms -r 1935 -f 8080 -s 8081 -l info

How to Configure the configuration file

RTMP
[rtmp]
enabled = true
port = 1935
# send webhook on publish and publish done
[rtmp.webhooks]
enabled = true
publish_url = "http://localhost:8080/api/v1/publish"
publish_done_url = "http://localhost:8080/api/v1/publish_done"
# 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"
[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:

gms/application/gms/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

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
Play

Use ffplay to play the rtmp/httpflv/hls live stream:

ffplay -i rtmp://localhost:1935/live/test
ffplay -i http://localhost:8081/live/test.flv
ffplay -i http://localhost:8080/live/test/test.m3u8
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:

./gms config.toml
./gms 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:

./gms config.toml
./gms 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

Thanks

Others

Open issues if you have any problems. Star and pull requests are welcomed. Your stars can make this project go faster and further.

About

A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages