-
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
16 changed files
with
665 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
FROM epicmorg/balancer | ||
LABEL maintainer="EpicMorg DevTeam, [email protected]" | ||
ARG DEBIAN_FRONTEND=noninteractive | ||
|
||
ARG NGINX_RTMP_MODULE_VERSION=1.2.1 | ||
|
||
################################################################## | ||
# sid sources list | ||
################################################################## | ||
RUN rm -rfv /etc/apt/sources.list | ||
COPY sources.list.d/sources.sid.list /etc/apt/sources.list | ||
RUN apt update | ||
|
||
################################################################## | ||
# installing utils | ||
################################################################## | ||
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \ | ||
apt-get update && \ | ||
apt-get install -y --allow-unauthenticated \ | ||
libpcre3-dev \ | ||
librtmp1 \ | ||
libtheora0 \ | ||
libvorbis-dev \ | ||
libmp3lame0 \ | ||
libx264-dev \ | ||
libx265-dev | ||
|
||
|
||
################################################################## | ||
# stretch sources list + libvpx | ||
################################################################## | ||
RUN rm -rfv /etc/apt/sources.list | ||
COPY sources.list.d/sources.stretch.list /etc/apt/sources.list | ||
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \ | ||
apt-get update && \ | ||
apt-get install -y --allow-unauthenticated \ | ||
libvpx4 | ||
|
||
|
||
################################################################## | ||
# buster sources list + libvpx | ||
################################################################## | ||
RUN rm -rfv /etc/apt/sources.list | ||
COPY sources.list.d/sources.buster.list /etc/apt/sources.list | ||
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \ | ||
apt-get update && \ | ||
apt-get install -y --allow-unauthenticated \ | ||
libvpx5 | ||
|
||
|
||
################################################################## | ||
# sid sources list + libvpx | ||
################################################################## | ||
RUN rm -rfv /etc/apt/sources.list | ||
COPY sources.list.d/sources.sid.list /etc/apt/sources.list | ||
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \ | ||
apt-get update && \ | ||
apt-get install -y --allow-unauthenticated \ | ||
libvpx6 | ||
|
||
|
||
################################################################## | ||
# installing deps for rtmp module | ||
################################################################## | ||
RUN mkdir -p /usr/share/nginx/html \ | ||
/mnt/hls \ | ||
/mnt/dash \ | ||
/tmp/build && \ | ||
cd /tmp/build && \ | ||
wget https://github.com/arut/nginx-rtmp-module/archive/v${NGINX_RTMP_MODULE_VERSION}.tar.gz && \ | ||
tar -zxf v${NGINX_RTMP_MODULE_VERSION}.tar.gz && \ | ||
rm v${NGINX_RTMP_MODULE_VERSION}.tar.gz && \ | ||
cp /tmp/build/nginx-rtmp-module-${NGINX_RTMP_MODULE_VERSION}/stat.xsl /usr/share/nginx/html/stat.xsl && \ | ||
rm -rf /tmp/build | ||
|
||
|
||
################################################################## | ||
# Forward logs to Docker | ||
################################################################## | ||
RUN ln -sf /dev/stdout /var/log/nginx/access.log && \ | ||
ln -sf /dev/stderr /var/log/nginx/error.log | ||
|
||
|
||
################################################################## | ||
# Copy nginx config file to container | ||
################################################################## | ||
RUN rm -rfv /etc/nginx/nginx.conf | ||
COPY conf/nginx.conf /etc/nginx/nginx.conf | ||
|
||
|
||
################################################################## | ||
# Copy html players to container | ||
################################################################## | ||
COPY players /usr/share/nginx/html/players | ||
|
||
|
||
################################################################## | ||
# cleaninig up | ||
################################################################## | ||
RUN apt clean -y && \ | ||
apt autoclean -y && \ | ||
rm -rfv /var/lib/apt/lists/* && \ | ||
rm -rfv /var/cache/apt/archives/*.deb | ||
|
||
|
||
EXPOSE 1935 | ||
EXPOSE 8080 | ||
|
||
CMD ["nginx", "-g", "daemon off;"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
all: nginx | ||
|
||
nginx: | ||
docker build --compress -t epicmorg/balancer:rtmp-hls . | ||
docker push epicmorg/balancer:rtmp-hls |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
# RTMP-HLS Docker | ||
|
||
**BASED ON** [TareqAlqutami/rtmp-hls-server](https://github.com/TareqAlqutami/rtmp-hls-server) | ||
|
||
**Docker image for video streaming server that supports RTMP, HLS, and DASH streams.** | ||
|
||
## Description | ||
|
||
This Docker image can be used to create a video streaming server that supports [**RTMP**](https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol), [**HLS**](https://en.wikipedia.org/wiki/HTTP_Live_Streaming), [**DASH**](https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP) out of the box. | ||
It also allows adaptive streaming and custom transcoding of video streams. | ||
All modules are built from source on Debian and Alpine Linux base images. | ||
|
||
## Features | ||
* The backend is [**Nginx**](http://nginx.org/en/) with [**nginx-rtmp-module**](https://github.com/arut/nginx-rtmp-module). | ||
* [**FFmpeg**](https://www.ffmpeg.org/) for transcoding and adaptive streaming. | ||
* Default settings: | ||
* RTMP is ON | ||
* HLS is ON (adaptive, 5 variants) | ||
* DASH is ON | ||
* Other Nginx configuration files are also provided to allow for RTMP-only streams or no-FFmpeg transcoding. | ||
* Statistic page of RTMP streams at `http://<server ip>:<server port>/stats`. | ||
* Available web video players (based on [video.js](https://videojs.com/) and [hls.js](https://github.com/video-dev/hls.js/)) at `/usr/local/nginx/html/players`. | ||
|
||
## Usage | ||
|
||
### To run the server | ||
``` | ||
docker run -d -p 1935:1935 -p 8080:8080 epicmorg/balancer:rtmp-hls | ||
``` | ||
|
||
To run with custom conf file: | ||
``` | ||
docker run -d -p 1935:1935 -p 8080:8080 -v custom.conf:/etc/nginx/nginx.conf epicmorg/balancer:rtmp-hls | ||
``` | ||
where `custom.conf` is the new conf file for Nginx. | ||
|
||
### To stream to the server | ||
* **Stream live RTMP content to:** | ||
``` | ||
rtmp://<server ip>:1935/live/<stream_key> | ||
``` | ||
where `<stream_key>` is any stream key you specify. | ||
|
||
* **Configure [OBS](https://obsproject.com/) to stream content:** <br /> | ||
Go to Settings > Stream, choose the following settings: | ||
* Service: Custom Streaming Server. | ||
* Server: `rtmp://<server ip>:1935/live`. | ||
* Stream key: anything you want, however provided video players assume stream key is `test` | ||
|
||
### To view the stream | ||
* **Using [VLC](https://www.videolan.org/vlc/index.html):** | ||
* Go to Media > Open Network Stream. | ||
* Enter the streaming URL: `rtmp://<server ip>:1935/live/<stream-key>` | ||
Replace `<server ip>` with the IP of where the server is running, and | ||
`<stream-key>` with the stream key you used when setting up the stream. | ||
* For HLS and DASH, the URLs are of the forms: | ||
`http://<server ip>:8080/hls/<stream-key>.m3u8` and | ||
`http://<server ip>:8080/dash/<stream-key>_src.mpd` respectively. | ||
* Click Play. | ||
|
||
* **Using provided web players:** <br/> | ||
The provided demo players assume the stream-key is called `test` and the player is opened in localhost. | ||
* To play RTMP content (requires Flash): `http://localhost:8080/players/rtmp.html` | ||
* To play HLS content: `http://localhost:8080/players/hls.html` | ||
* To play HLS content using hls.js library: `http://localhost:8080/players/hls_hlsjs.html` | ||
* To play DASH content: `http://localhost:8080/players/dash.html` | ||
* To play RTMP and HLS contents on the same page: `http://localhost:8080/players/rtmp_hls.html` | ||
|
||
**Notes:** | ||
|
||
* These web players are hardcoded to play stream key "test" at localhost. | ||
* To change the stream source for these players. Download the html files and modify the `src` attribute in the video tag in the html file. You can then mount the modified files to the container as follows: | ||
``` | ||
docker run -d -p 1935:1935 -p 8080:8080 -v custom_players:/usr/local/nginx/html/players epicmorg/balancer:rtmp-hls | ||
``` | ||
where `custom_players` is the directory holding the modified html files. | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
load_module "/usr/lib/nginx/modules/ngx_rtmp_module.so"; | ||
|
||
worker_processes auto; | ||
#error_log logs/error.log; | ||
|
||
events { | ||
worker_connections 1024; | ||
} | ||
|
||
# RTMP configuration | ||
rtmp { | ||
server { | ||
listen 1935; # Listen on standard RTMP port | ||
chunk_size 4000; | ||
# ping 30s; | ||
# notify_method get; | ||
|
||
# This application is to accept incoming stream | ||
application live { | ||
live on; # Allows live input | ||
|
||
# for each received stream, transcode for adaptive streaming | ||
# This single ffmpeg command takes the input and transforms | ||
# the source into 4 different streams with different bitrates | ||
# and qualities. # these settings respect the aspect ratio. | ||
exec_push /usr/bin/ffmpeg -i rtmp://localhost:1935/$app/$name -async 1 -vsync -1 | ||
-c:v libx264 -c:a aac -b:v 256k -b:a 64k -vf "scale=480:trunc(ow/a/2)*2" -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/show/$name_low | ||
-c:v libx264 -c:a aac -b:v 768k -b:a 128k -vf "scale=720:trunc(ow/a/2)*2" -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/show/$name_mid | ||
-c:v libx264 -c:a aac -b:v 1024k -b:a 128k -vf "scale=960:trunc(ow/a/2)*2" -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/show/$name_high | ||
-c:v libx264 -c:a aac -b:v 1920k -b:a 128k -vf "scale=1280:trunc(ow/a/2)*2" -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/show/$name_hd720 | ||
-c copy -f flv rtmp://localhost:1935/show/$name_src; | ||
} | ||
|
||
# This is the HLS application | ||
application show { | ||
live on; # Allows live input from above application | ||
deny play all; # disable consuming the stream from nginx as rtmp | ||
|
||
hls on; # Enable HTTP Live Streaming | ||
hls_fragment 3; | ||
hls_playlist_length 20; | ||
hls_path /mnt/hls/; # hls fragments path | ||
# Instruct clients to adjust resolution according to bandwidth | ||
hls_variant _src BANDWIDTH=4096000; # Source bitrate, source resolution | ||
hls_variant _hd720 BANDWIDTH=2048000; # High bitrate, HD 720p resolution | ||
hls_variant _high BANDWIDTH=1152000; # High bitrate, higher-than-SD resolution | ||
hls_variant _mid BANDWIDTH=448000; # Medium bitrate, SD resolution | ||
hls_variant _low BANDWIDTH=288000; # Low bitrate, sub-SD resolution | ||
|
||
# MPEG-DASH | ||
dash on; | ||
dash_path /mnt/dash/; # dash fragments path | ||
dash_fragment 3; | ||
dash_playlist_length 20; | ||
} | ||
} | ||
} | ||
|
||
|
||
http { | ||
sendfile off; | ||
tcp_nopush on; | ||
directio 512; | ||
# aio on; | ||
|
||
# HTTP server required to serve the player and HLS fragments | ||
server { | ||
listen 8080; | ||
|
||
# Serve HLS fragments | ||
location /hls { | ||
types { | ||
application/vnd.apple.mpegurl m3u8; | ||
video/mp2t ts; | ||
} | ||
|
||
root /mnt; | ||
|
||
add_header Cache-Control no-cache; # Disable cache | ||
|
||
# CORS setup | ||
add_header 'Access-Control-Allow-Origin' '*' always; | ||
add_header 'Access-Control-Expose-Headers' 'Content-Length'; | ||
|
||
# allow CORS preflight requests | ||
if ($request_method = 'OPTIONS') { | ||
add_header 'Access-Control-Allow-Origin' '*'; | ||
add_header 'Access-Control-Max-Age' 1728000; | ||
add_header 'Content-Type' 'text/plain charset=UTF-8'; | ||
add_header 'Content-Length' 0; | ||
return 204; | ||
} | ||
} | ||
|
||
# Serve DASH fragments | ||
location /dash { | ||
types { | ||
application/dash+xml mpd; | ||
video/mp4 mp4; | ||
} | ||
|
||
root /mnt; | ||
|
||
add_header Cache-Control no-cache; # Disable cache | ||
|
||
|
||
# CORS setup | ||
add_header 'Access-Control-Allow-Origin' '*' always; | ||
add_header 'Access-Control-Expose-Headers' 'Content-Length'; | ||
|
||
# Allow CORS preflight requests | ||
if ($request_method = 'OPTIONS') { | ||
add_header 'Access-Control-Allow-Origin' '*'; | ||
add_header 'Access-Control-Max-Age' 1728000; | ||
add_header 'Content-Type' 'text/plain charset=UTF-8'; | ||
add_header 'Content-Length' 0; | ||
return 204; | ||
} | ||
} | ||
|
||
# This URL provides RTMP statistics in XML | ||
location /stat { | ||
rtmp_stat all; | ||
rtmp_stat_stylesheet stat.xsl; # Use stat.xsl stylesheet | ||
} | ||
|
||
location /stat.xsl { | ||
# XML stylesheet to view RTMP stats. | ||
root /usr/share/nginx/html; | ||
} | ||
|
||
} | ||
} |
Oops, something went wrong.