├── .github
├── dependabot.yml
└── workflows
│ ├── docker-build.yml
│ └── docker-publish.yml
├── docker-compose.yml
├── static
├── crossdomain.xml
├── player.html
└── stat.xsl
├── .travis.yml
├── LICENSE
├── entrypoint.cuda.sh
├── certs
├── example.com.crt
└── example.com.key
├── nginx-cuda.conf
├── nginx.conf
├── Dockerfile
├── Dockerfile.cuda
└── README.md
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: "docker"
4 | directory: "/"
5 | schedule:
6 | interval: "monthly"
7 | - package-ecosystem: "github-actions"
8 | directory: "/"
9 | schedule:
10 | interval: "monthly"
11 |
12 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | services:
4 | nginx-rtmp:
5 | build: .
6 | ports:
7 | - 1935:1935
8 | - 8080:80
9 | - 8443:443
10 | environment:
11 | - HTTP_PORT=80
12 | - RTMP_PORT=1935
13 | volumes:
14 | - ./certs:/opt/certs
--------------------------------------------------------------------------------
/static/crossdomain.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.github/workflows/docker-build.yml:
--------------------------------------------------------------------------------
1 | name: Build Docker Image
2 |
3 | on:
4 | push:
5 | branches: [ master ]
6 | pull_request:
7 | branches: [ master ]
8 |
9 | jobs:
10 |
11 | build:
12 |
13 | runs-on: ubuntu-latest
14 |
15 | steps:
16 | - uses: actions/checkout@v3
17 | - name: Build the Docker image
18 | run: docker build . --file Dockerfile --tag nginx-rtmp:$(date +%s)
19 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: required
2 |
3 | language: bash
4 | services: docker
5 |
6 | jobs:
7 | include:
8 | - env:
9 | - DOCKER_FILE=Dockerfile
10 | - DOCKER_TAG=latest
11 | - DOCKER_IMAGE=nginx-rtmp
12 | - env:
13 | - DOCKER_FILE=Dockerfile.cuda
14 | - DOCKER_TAG=cuda
15 | - DOCKER_IMAGE=nginx-rtmp
16 |
17 | script:
18 | - docker build -t ${DOCKER_IMAGE}:${DOCKER_TAG} -f ${DOCKER_FILE} .
19 |
20 | after_script:
21 | - docker images
22 | - docker run -d -p 1935:1935 -p 8080:80 -t ${DOCKER_IMAGE}:${DOCKER_TAG}
23 | - docker ps -a
24 |
--------------------------------------------------------------------------------
/.github/workflows/docker-publish.yml:
--------------------------------------------------------------------------------
1 | name: Publish Docker Image
2 |
3 | on:
4 | release:
5 | types: [published]
6 |
7 | jobs:
8 | push_to_registry:
9 | name: Push Docker image to Docker Hub
10 | runs-on: ubuntu-latest
11 | steps:
12 | - name: Check out the repo
13 | uses: actions/checkout@v3
14 |
15 | - name: Log in to Docker Hub
16 | uses: docker/login-action@49ed152c8eca782a232dede0303416e8f356c37b
17 | with:
18 | username: ${{ secrets.DOCKER_USERNAME }}
19 | password: ${{ secrets.DOCKER_PASSWORD }}
20 |
21 | - name: Extract metadata (tags, labels) for Docker
22 | id: meta
23 | uses: docker/metadata-action@69f6fc9d46f2f8bf0d5491e4aabe0bb8c6a4678a
24 | with:
25 | images: alfg/nginx-rtmp
26 |
27 | - name: Build and push Docker image
28 | uses: docker/build-push-action@1cb9d22b932e4832bb29793b7777ec860fc1cde0
29 | with:
30 | context: .
31 | push: true
32 | tags: ${{ steps.meta.outputs.tags }}
33 | labels: ${{ steps.meta.outputs.labels }}
34 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Alfred Gutierrez
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/static/player.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | hls.js Player
7 |
8 |
26 |
27 |
28 |
35 |
36 |
51 |
52 |
--------------------------------------------------------------------------------
/entrypoint.cuda.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -e
3 |
4 | if [ ! -v "${MAX_MUXING_QUEUE_SIZE}" ]; then
5 | MAX_MUXING_QUEUE_SIZE_ARG="-max_muxing_queue_size ${MAX_MUXING_QUEUE_SIZE} "
6 | fi
7 |
8 | if [ ! -v "${ANALYZEDURATION}" ]; then
9 | ANALYZEDURATION_ARG="-analyzeduration ${ANALYZEDURATION} "
10 | fi
11 |
12 | quality1=('480' '256k' '64k' 'low' '448000')
13 | quality2=('720' '768k' '128k' 'mid' '448000')
14 | quality3=('960' '1240k' '128k' 'high' '1152000')
15 | quality4=('1280' '1920k' '128k' 'hd720' '2048000')
16 |
17 | if [ -v ${SINGLE_STREAM} ]; then
18 | qualities=(quality1 quality2 quality3 quality4)
19 | else
20 | qualities=(quality4)
21 | fi
22 |
23 | output_execpush="/usr/local/bin/ffmpeg $ANALYZEDURATION_ARG-async 1 -vsync -1 -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i rtmp://localhost:1935/stream/\$name "
24 | output_hlsvariants=""
25 | for quality in "${qualities[@]}"; do
26 | declare -n qualitylist=$quality
27 | output_execpush="$output_execpush"$'\n\t\t'"-c:v h264_nvenc -c:a aac -b:v ${qualitylist[1]} -b:a ${qualitylist[2]} -vf \"scale_npp=${qualitylist[0]}:trunc(ow/a/2)*2\" -zerolatency 1 $MAX_MUXING_QUEUE_SIZE_ARG-f flv rtmp://localhost:1935/hls/\$name_${qualitylist[3]}"
28 | output_hlsvariants=$'\n\t\t'"hls_variant _${qualitylist[3]} BANDWIDTH=${qualitylist[4]};"$'\n'"${output_hlsvariants}"
29 | done
30 |
31 | export EXECPUSH="$output_execpush"
32 | export HLSVARIANTS="$output_hlsvariants"
33 |
34 | envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < \
35 | /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
36 |
37 | nginx
38 |
--------------------------------------------------------------------------------
/certs/example.com.crt:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIFXTCCA0WgAwIBAgIJAMCQYDhYg4RNMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
3 | BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
4 | aWRnaXRzIFB0eSBMdGQwHhcNMTgxMTIwMjA1ODM1WhcNMTkxMTIwMjA1ODM1WjBF
5 | MQswCQYDVQQGEwJVUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
6 | ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
7 | CgKCAgEAv2Wzdiw3kgw8USDpXxUSVbv4fMoGmf2PtcjZn6nSdGndZBpt2ODxYRvz
8 | TFrAuL944DCQY5MuDRC7z5siFHUe14ravRTavjs5+Kr5XelVN0wofgMp2Npg+6xX
9 | lT4t/cb4T88hqm3UMn0AcoAD9L8oZCs+4aHIwNZT8tts5cbcenJxNrdFri28L+Q5
10 | sx5CrOeoQP8R1C01z3aXYzQXZ97w9hr35BBkzRVt4mvi9L5CLAzlVxn/4vGy/tV1
11 | PAbQaMFBWR2gjzNKx0+DKcsz1hKo7UXi3LVfJAn9xmcwfQcpWEH74EIkLpAyQ/oF
12 | rhZS/I+OCCuh13bKEIfCY0ICN2u7agTBhzbnWXkF9CKb2ElKJd1C96myWmHmJT8G
13 | d34l7/vKYXQUGnds+2yN2heZj3/0eCcq3Pv6DcgjoBkYEJ35Z2jVq/w38cJeAw2d
14 | 7CrGJlfBrmi3v2WSXHjRnvU9vVTgN/mFNdTQLKeMHHiZPiK91nj1UEEcXhAYL731
15 | HxJ+Xb/Wx5OO+Ki0vL3GdQJQr8BtW5tpSUYJgiLvp+dIUST8IBo1s6w5DtcqmpY1
16 | 254AgGjNLXruq6juGbgVBRLhmoU0r8xsROproAvtd+bnej90hcHfqvgsg9+8Nttr
17 | pigRPHHbY7iE5b9p24XbbHVhTJ7htQ4t9uJ/I979A1StLBnqfD8CAwEAAaNQME4w
18 | HQYDVR0OBBYEFJNRWzeHz7m+VAfnu7Q9eU6L5EdWMB8GA1UdIwQYMBaAFJNRWzeH
19 | z7m+VAfnu7Q9eU6L5EdWMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIB
20 | ADk8i3rp0LthFeR1FCjg5Q7wZfEk2uWyGEZYpWet4+ECB3ATWnVMUl8pqqb1zGVL
21 | kG5/WYKIDP81VpxL5dK+EqnQCIV80b0lswxl9Qr6AKgg9FvbInKVfoRN3uRw1iHw
22 | +URYi0nxzFncxdCvNWLL07Nxt7OmkxxBiDfMOBmmmz+CWqm3MeH+5fEak1AkIJFE
23 | Kq54qD1F9UWBMG3OVxhSUML4b/QdcIQ6+gDa2LT97GFIK2RBHWtQARYSBTcMbxfm
24 | XSWDuyibYhKh3L3G/NcG2LEWzBO7+VW06tP+B3Ki8dgyLZk1fq5k1stsv8m2z8mx
25 | iOM4gIxZ5DgKBad/LthFGvxIKBn9znQ/SmkZjl8G6//lbCzlmLm4e4+75c5YTT3/
26 | ZrVDev30Ln8RveE+wBX6ZUHaSnGTWp08hry3JIE8YFCN4E+LXkyayq96ujVugCJC
27 | wCE/aLT3sPgRxZcRNbB8lmur8BcEuoZphm4jLoctBhnM7NVcJHaTYWazNvpDKCaT
28 | sAi5xNu+/NzrwNhYCWVNrWJjfwyLpOEaI60GDmR1iy/MWeikYw+C/YMKmFXmjuIw
29 | 1IX5a7+Yu5etGN+qvYdZOS3RpVxuT1OJk1haatXficL7FYU16XUm19ggN1W0uYb+
30 | CGbQoh//o8p01K+AmiO4P0NsTSoK/Ap2MjrNhAAq4HV0
31 | -----END CERTIFICATE-----
32 |
--------------------------------------------------------------------------------
/nginx-cuda.conf:
--------------------------------------------------------------------------------
1 | daemon off;
2 |
3 | error_log /dev/stdout info;
4 |
5 | events {
6 | worker_connections 1024;
7 | }
8 |
9 | rtmp {
10 | server {
11 | listen ${RTMP_PORT};
12 | chunk_size 4000;
13 |
14 | application stream {
15 | live on;
16 |
17 | exec_push ${EXECPUSH};
18 | }
19 |
20 | application hls {
21 | live on;
22 | hls on;
23 | hls_fragment_naming system;
24 | hls_fragment 5;
25 | hls_playlist_length 10;
26 | hls_path /opt/data/hls;
27 | hls_nested on;
28 |
29 | ${HLSVARIANTS}
30 | }
31 | }
32 | }
33 |
34 | http {
35 | root /www/static;
36 | sendfile off;
37 | tcp_nopush on;
38 | server_tokens off;
39 | access_log /dev/stdout combined;
40 |
41 | # Uncomment these lines to enable SSL.
42 | # ssl_protocols TLSv1.2 TLSv1.3;
43 | # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
44 | # ssl_prefer_server_ciphers off;
45 | # ssl_session_cache shared:SSL:10m;
46 | # ssl_session_timeout 1d;
47 |
48 | server {
49 | listen ${HTTP_PORT};
50 |
51 | # Uncomment these lines to enable SSL.
52 | # Update the ssl paths with your own certificate and private key.
53 |
54 | # listen ${HTTPS_PORT} ssl;
55 | # ssl_certificate /opt/certs/example.com.crt;
56 | # ssl_certificate_key /opt/certs/example.com.key;
57 |
58 | location /hls {
59 | types {
60 | application/vnd.apple.mpegurl m3u8;
61 | video/mp2t ts;
62 | }
63 | root /opt/data;
64 | add_header Cache-Control no-cache;
65 | add_header Access-Control-Allow-Origin *;
66 | }
67 |
68 | location /live {
69 | alias /opt/data/hls;
70 | types {
71 | application/vnd.apple.mpegurl m3u8;
72 | video/mp2t ts;
73 | }
74 | add_header Cache-Control no-cache;
75 | add_header Access-Control-Allow-Origin *;
76 | }
77 |
78 | location /stat {
79 | rtmp_stat all;
80 | rtmp_stat_stylesheet stat.xsl;
81 | }
82 |
83 | location /stat.xsl {
84 | root /www/static;
85 | }
86 |
87 | location /crossdomain.xml {
88 | default_type text/xml;
89 | expires 24h;
90 | }
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/certs/example.com.key:
--------------------------------------------------------------------------------
1 | -----BEGIN PRIVATE KEY-----
2 | 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
51 | IW8oyQg/bNSFBykcUbWZVZhQGVT4RLB/mA==
52 | -----END PRIVATE KEY-----
53 |
--------------------------------------------------------------------------------
/nginx.conf:
--------------------------------------------------------------------------------
1 | daemon off;
2 |
3 | error_log /dev/stdout info;
4 |
5 | events {
6 | worker_connections 1024;
7 | }
8 |
9 | rtmp {
10 | server {
11 | listen ${RTMP_PORT};
12 | chunk_size 4000;
13 |
14 | application stream {
15 | live on;
16 |
17 | exec ffmpeg -i rtmp://localhost:1935/stream/$name
18 | -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 2500k -f flv -g 30 -r 30 -s 1280x720 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_720p2628kbs
19 | -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 1000k -f flv -g 30 -r 30 -s 854x480 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_480p1128kbs
20 | -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 750k -f flv -g 30 -r 30 -s 640x360 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_360p878kbs
21 | -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 400k -f flv -g 30 -r 30 -s 426x240 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_240p528kbs
22 | -c:a libfdk_aac -b:a 64k -c:v libx264 -b:v 200k -f flv -g 15 -r 15 -s 426x240 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_240p264kbs;
23 | }
24 |
25 | application hls {
26 | live on;
27 | hls on;
28 | hls_fragment_naming system;
29 | hls_fragment 5;
30 | hls_playlist_length 10;
31 | hls_path /opt/data/hls;
32 | hls_nested on;
33 |
34 | hls_variant _720p2628kbs BANDWIDTH=2628000,RESOLUTION=1280x720;
35 | hls_variant _480p1128kbs BANDWIDTH=1128000,RESOLUTION=854x480;
36 | hls_variant _360p878kbs BANDWIDTH=878000,RESOLUTION=640x360;
37 | hls_variant _240p528kbs BANDWIDTH=528000,RESOLUTION=426x240;
38 | hls_variant _240p264kbs BANDWIDTH=264000,RESOLUTION=426x240;
39 | }
40 | }
41 | }
42 |
43 | http {
44 | root /www/static;
45 | sendfile off;
46 | tcp_nopush on;
47 | server_tokens off;
48 | access_log /dev/stdout combined;
49 |
50 | # Uncomment these lines to enable SSL.
51 | # ssl_protocols TLSv1.2 TLSv1.3;
52 | # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
53 | # ssl_prefer_server_ciphers off;
54 | # ssl_session_cache shared:SSL:10m;
55 | # ssl_session_timeout 1d;
56 |
57 | server {
58 | listen ${HTTP_PORT};
59 |
60 | # Uncomment these lines to enable SSL.
61 | # Update the ssl paths with your own certificate and private key.
62 |
63 | # listen ${HTTPS_PORT} ssl;
64 | # ssl_certificate /opt/certs/example.com.crt;
65 | # ssl_certificate_key /opt/certs/example.com.key;
66 |
67 | location /hls {
68 | types {
69 | application/vnd.apple.mpegurl m3u8;
70 | video/mp2t ts;
71 | }
72 | root /opt/data;
73 | add_header Cache-Control no-cache;
74 | add_header Access-Control-Allow-Origin *;
75 | }
76 |
77 | location /live {
78 | alias /opt/data/hls;
79 | types {
80 | application/vnd.apple.mpegurl m3u8;
81 | video/mp2t ts;
82 | }
83 | add_header Cache-Control no-cache;
84 | add_header Access-Control-Allow-Origin *;
85 | }
86 |
87 | location /stat {
88 | rtmp_stat all;
89 | rtmp_stat_stylesheet stat.xsl;
90 | }
91 |
92 | location /stat.xsl {
93 | root /www/static;
94 | }
95 |
96 | location /crossdomain.xml {
97 | default_type text/xml;
98 | expires 24h;
99 | }
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | ARG NGINX_VERSION=1.23.1
2 | ARG NGINX_RTMP_VERSION=1.2.2
3 | ARG FFMPEG_VERSION=5.1
4 |
5 | ##############################
6 | # Build the NGINX-build image.
7 | FROM alpine:3.16.1 as build-nginx
8 | ARG NGINX_VERSION
9 | ARG NGINX_RTMP_VERSION
10 | ARG MAKEFLAGS="-j4"
11 |
12 | # Build dependencies.
13 | RUN apk add --no-cache \
14 | build-base \
15 | ca-certificates \
16 | curl \
17 | gcc \
18 | libc-dev \
19 | libgcc \
20 | linux-headers \
21 | make \
22 | musl-dev \
23 | openssl \
24 | openssl-dev \
25 | pcre \
26 | pcre-dev \
27 | pkgconf \
28 | pkgconfig \
29 | zlib-dev
30 |
31 | WORKDIR /tmp
32 |
33 | # Get nginx source.
34 | RUN wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
35 | tar zxf nginx-${NGINX_VERSION}.tar.gz && \
36 | rm nginx-${NGINX_VERSION}.tar.gz
37 |
38 | # Get nginx-rtmp module.
39 | RUN wget https://github.com/arut/nginx-rtmp-module/archive/v${NGINX_RTMP_VERSION}.tar.gz && \
40 | tar zxf v${NGINX_RTMP_VERSION}.tar.gz && \
41 | rm v${NGINX_RTMP_VERSION}.tar.gz
42 |
43 | # Compile nginx with nginx-rtmp module.
44 | WORKDIR /tmp/nginx-${NGINX_VERSION}
45 | RUN \
46 | ./configure \
47 | --prefix=/usr/local/nginx \
48 | --add-module=/tmp/nginx-rtmp-module-${NGINX_RTMP_VERSION} \
49 | --conf-path=/etc/nginx/nginx.conf \
50 | --with-threads \
51 | --with-file-aio \
52 | --with-http_ssl_module \
53 | --with-debug \
54 | --with-http_stub_status_module \
55 | --with-cc-opt="-Wimplicit-fallthrough=0" && \
56 | make && \
57 | make install
58 |
59 | ###############################
60 | # Build the FFmpeg-build image.
61 | FROM alpine:3.16.1 as build-ffmpeg
62 | ARG FFMPEG_VERSION
63 | ARG PREFIX=/usr/local
64 | ARG MAKEFLAGS="-j4"
65 |
66 | # FFmpeg build dependencies.
67 | RUN apk add --no-cache \
68 | build-base \
69 | coreutils \
70 | freetype-dev \
71 | lame-dev \
72 | libogg-dev \
73 | libass \
74 | libass-dev \
75 | libvpx-dev \
76 | libvorbis-dev \
77 | libwebp-dev \
78 | libtheora-dev \
79 | openssl-dev \
80 | opus-dev \
81 | pkgconf \
82 | pkgconfig \
83 | rtmpdump-dev \
84 | wget \
85 | x264-dev \
86 | x265-dev \
87 | yasm
88 |
89 | RUN echo http://dl-cdn.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories
90 | RUN apk add --no-cache fdk-aac-dev
91 |
92 | WORKDIR /tmp
93 |
94 | # Get FFmpeg source.
95 | RUN wget http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz && \
96 | tar zxf ffmpeg-${FFMPEG_VERSION}.tar.gz && \
97 | rm ffmpeg-${FFMPEG_VERSION}.tar.gz
98 |
99 | # Compile ffmpeg.
100 | WORKDIR /tmp/ffmpeg-${FFMPEG_VERSION}
101 | RUN \
102 | ./configure \
103 | --prefix=${PREFIX} \
104 | --enable-version3 \
105 | --enable-gpl \
106 | --enable-nonfree \
107 | --enable-small \
108 | --enable-libmp3lame \
109 | --enable-libx264 \
110 | --enable-libx265 \
111 | --enable-libvpx \
112 | --enable-libtheora \
113 | --enable-libvorbis \
114 | --enable-libopus \
115 | --enable-libfdk-aac \
116 | --enable-libass \
117 | --enable-libwebp \
118 | --enable-postproc \
119 | --enable-libfreetype \
120 | --enable-openssl \
121 | --disable-debug \
122 | --disable-doc \
123 | --disable-ffplay \
124 | --extra-libs="-lpthread -lm" && \
125 | make && \
126 | make install && \
127 | make distclean
128 |
129 | # Cleanup.
130 | RUN rm -rf /var/cache/* /tmp/*
131 |
132 | ##########################
133 | # Build the release image.
134 | FROM alpine:3.16.1
135 | LABEL MAINTAINER Alfred Gutierrez
136 |
137 | # Set default ports.
138 | ENV HTTP_PORT 80
139 | ENV HTTPS_PORT 443
140 | ENV RTMP_PORT 1935
141 |
142 | RUN apk add --no-cache \
143 | ca-certificates \
144 | gettext \
145 | openssl \
146 | pcre \
147 | lame \
148 | libogg \
149 | curl \
150 | libass \
151 | libvpx \
152 | libvorbis \
153 | libwebp \
154 | libtheora \
155 | opus \
156 | rtmpdump \
157 | x264-dev \
158 | x265-dev
159 |
160 | COPY --from=build-nginx /usr/local/nginx /usr/local/nginx
161 | COPY --from=build-nginx /etc/nginx /etc/nginx
162 | COPY --from=build-ffmpeg /usr/local /usr/local
163 | COPY --from=build-ffmpeg /usr/lib/libfdk-aac.so.2 /usr/lib/libfdk-aac.so.2
164 |
165 | # Add NGINX path, config and static files.
166 | ENV PATH "${PATH}:/usr/local/nginx/sbin"
167 | COPY nginx.conf /etc/nginx/nginx.conf.template
168 | RUN mkdir -p /opt/data && mkdir /www
169 | COPY static /www/static
170 |
171 | EXPOSE 1935
172 | EXPOSE 80
173 |
174 | CMD envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < \
175 | /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf && \
176 | nginx
177 |
--------------------------------------------------------------------------------
/Dockerfile.cuda:
--------------------------------------------------------------------------------
1 | ARG NGINX_VERSION=1.23.1
2 | ARG NGINX_RTMP_VERSION=1.2.2
3 | ARG FFMPEG_VERSION=5.1
4 |
5 | ##############################
6 | # Build the NGINX-build image.
7 | FROM ubuntu:22.04 as build-nginx
8 | ARG NGINX_VERSION
9 | ARG NGINX_RTMP_VERSION
10 | ARG MAKEFLAGS="-j4"
11 |
12 | # Build dependencies.
13 | RUN apt update && apt install -y --no-install-recommends\
14 | build-essential \
15 | cmake \
16 | ca-certificates \
17 | curl \
18 | gcc \
19 | libc-dev \
20 | make \
21 | musl-dev \
22 | openssl \
23 | libssl-dev \
24 | libpcre3 \
25 | libpcre3-dev \
26 | pkg-config \
27 | zlib1g-dev \
28 | wget && \
29 | rm -rf /var/lib/apt/lists/*
30 |
31 | WORKDIR /tmp
32 |
33 | # Get nginx source.
34 | RUN wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
35 | tar zxf nginx-${NGINX_VERSION}.tar.gz && \
36 | rm nginx-${NGINX_VERSION}.tar.gz
37 |
38 | # Get nginx-rtmp module.
39 | RUN wget https://github.com/arut/nginx-rtmp-module/archive/v${NGINX_RTMP_VERSION}.tar.gz && \
40 | tar zxf v${NGINX_RTMP_VERSION}.tar.gz && \
41 | rm v${NGINX_RTMP_VERSION}.tar.gz
42 |
43 | # Compile nginx with nginx-rtmp module.
44 | WORKDIR /tmp/nginx-${NGINX_VERSION}
45 | RUN \
46 | ./configure \
47 | --prefix=/usr/local/nginx \
48 | --add-module=/tmp/nginx-rtmp-module-${NGINX_RTMP_VERSION} \
49 | --conf-path=/etc/nginx/nginx.conf \
50 | --with-threads \
51 | --with-file-aio \
52 | --with-http_ssl_module \
53 | --with-debug \
54 | --with-http_stub_status_module \
55 | --with-cc-opt="-Wimplicit-fallthrough=0" && \
56 | make && \
57 | make install
58 |
59 | ###############################
60 | # Build the FFmpeg-build image.
61 | FROM nvidia/cuda:11.7.0-devel-ubuntu20.04 as build-ffmpeg
62 |
63 | ENV DEBIAN_FRONTEND=noninteractive
64 | ARG FFMPEG_VERSION
65 | ARG PREFIX=/usr/local
66 | ARG MAKEFLAGS="-j4"
67 |
68 | # FFmpeg build dependencies.
69 | RUN apt update && apt install -y --no-install-recommends \
70 | build-essential \
71 | coreutils \
72 | cmake \
73 | libx264-dev \
74 | libx265-dev \
75 | libc6 \
76 | libc6-dev \
77 | libfreetype6-dev \
78 | libfdk-aac-dev \
79 | libmp3lame-dev \
80 | libogg-dev \
81 | libass9 \
82 | libass-dev \
83 | libnuma1 \
84 | libnuma-dev \
85 | libopus-dev \
86 | librtmp-dev \
87 | libvpx-dev \
88 | libvorbis-dev \
89 | libwebp-dev \
90 | libtheora-dev \
91 | libtool \
92 | libssl-dev \
93 | pkg-config \
94 | wget \
95 | yasm \
96 | git \
97 | ca-certificates && \
98 | rm -rf /var/lib/apt/lists/*
99 |
100 | WORKDIR /tmp
101 |
102 | # Clone and install ffnvcodec
103 | RUN git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git && \
104 | cd nv-codec-headers && \
105 | make install
106 |
107 | # Get FFmpeg source.
108 | RUN wget http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz && \
109 | tar zxf ffmpeg-${FFMPEG_VERSION}.tar.gz && \
110 | rm ffmpeg-${FFMPEG_VERSION}.tar.gz
111 |
112 | # Compile ffmpeg.
113 | WORKDIR /tmp/ffmpeg-${FFMPEG_VERSION}
114 | RUN \
115 | ./configure \
116 | --prefix=${PREFIX} \
117 | --enable-version3 \
118 | --enable-gpl \
119 | --enable-nonfree \
120 | --enable-small \
121 | --enable-libfdk-aac \
122 | --enable-openssl \
123 | --enable-libnpp \
124 | --enable-cuda \
125 | --enable-cuvid \
126 | --enable-nvenc \
127 | --enable-libnpp \
128 | --disable-debug \
129 | --disable-doc \
130 | --disable-ffplay \
131 | --extra-cflags=-I/usr/local/cuda/include \
132 | --extra-ldflags=-L/usr/local/cuda/lib64 \
133 | --extra-libs="-lpthread -lm" && \
134 | make && \
135 | make install && \
136 | make distclean
137 |
138 | # Cleanup.
139 | RUN rm -rf /var/cache/* /tmp/*
140 |
141 | ##########################
142 | # Build the release image.
143 | FROM nvidia/cuda:11.7.0-devel-ubuntu20.04
144 | LABEL MAINTAINER Alfred Gutierrez
145 |
146 | ENV DEBIAN_FRONTEND=noninteractive
147 | ENV NVIDIA_DRIVER_VERSION=455
148 | ENV NVIDIA_VISIBLE_DEVICES all
149 | ENV NVIDIA_DRIVER_CAPABILITIES compute,video,utility
150 |
151 | # Set default ports.
152 | ENV HTTP_PORT 80
153 | ENV HTTPS_PORT 443
154 | ENV RTMP_PORT 1935
155 |
156 | # Set default options.
157 | ENV SINGLE_STREAM ""
158 | ENV MAX_MUXING_QUEUE_SIZE ""
159 | ENV ANALYZEDURATION ""
160 |
161 | RUN apt update && apt install -y --no-install-recommends \
162 | ca-certificates \
163 | curl \
164 | gettext \
165 | libpcre3-dev \
166 | libnvidia-decode-${NVIDIA_DRIVER_VERSION} \
167 | libnvidia-encode-${NVIDIA_DRIVER_VERSION} \
168 | libtheora0 \
169 | openssl \
170 | rtmpdump && \
171 | rm -rf /var/lib/apt/lists/*
172 |
173 | COPY --from=build-nginx /usr/local/nginx /usr/local/nginx
174 | COPY --from=build-nginx /etc/nginx /etc/nginx
175 | COPY --from=build-ffmpeg /usr/local /usr/local
176 | COPY --from=build-ffmpeg /usr/lib/x86_64-linux-gnu/libfdk-aac.so.1 /usr/lib/x86_64-linux-gnu/libfdk-aac.so.1
177 |
178 | # Add NGINX path, config and static files.
179 | ENV PATH "${PATH}:/usr/local/nginx/sbin"
180 | RUN mkdir -p /opt/data && mkdir /www
181 | COPY nginx-cuda.conf /etc/nginx/nginx.conf.template
182 | COPY entrypoint.cuda.sh /opt/entrypoint.sh
183 | RUN chmod gu+x /opt/entrypoint.sh
184 | COPY static /www/static
185 |
186 | EXPOSE 1935
187 | EXPOSE 80
188 |
189 | ENTRYPOINT ["/opt/entrypoint.sh"]
190 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # docker-nginx-rtmp
2 | A Dockerfile installing NGINX, nginx-rtmp-module and FFmpeg from source with
3 | default settings for HLS live streaming. Built on Alpine Linux.
4 |
5 | * Nginx 1.23.1 (Mainline version compiled from source)
6 | * nginx-rtmp-module 1.2.2 (compiled from source)
7 | * ffmpeg 5.1 (compiled from source)
8 | * Default HLS settings (See: [nginx.conf](nginx.conf))
9 |
10 | [](https://hub.docker.com/r/alfg/nginx-rtmp/)
11 | [](https://hub.docker.com/r/alfg/nginx-rtmp/)
12 | [](https://hub.docker.com/r/alfg/nginx-rtmp/builds/)
13 | [](https://travis-ci.org/alfg/docker-nginx-rtmp)
14 |
15 | ## Usage
16 |
17 | ### Server
18 | * Pull docker image and run:
19 | ```
20 | docker pull alfg/nginx-rtmp
21 | docker run -it -p 1935:1935 -p 8080:80 --rm alfg/nginx-rtmp
22 | ```
23 | or
24 |
25 | * Build and run container from source:
26 | ```
27 | docker build -t nginx-rtmp .
28 | docker run -it -p 1935:1935 -p 8080:80 --rm nginx-rtmp
29 | ```
30 |
31 | * Stream live content to:
32 | ```
33 | rtmp://localhost:1935/stream/$STREAM_NAME
34 | ```
35 |
36 | ### SSL
37 | To enable SSL, see [nginx.conf](nginx.conf) and uncomment the lines:
38 | ```
39 | listen 443 ssl;
40 | ssl_certificate /opt/certs/example.com.crt;
41 | ssl_certificate_key /opt/certs/example.com.key;
42 | ```
43 |
44 | This will enable HTTPS using a self-signed certificate supplied in [/certs](/certs). If you wish to use HTTPS, it is **highly recommended** to obtain your own certificates and update the `ssl_certificate` and `ssl_certificate_key` paths.
45 |
46 | I recommend using [Certbot](https://certbot.eff.org/docs/install.html) from [Let's Encrypt](https://letsencrypt.org).
47 |
48 | ### Environment Variables
49 | This Docker image uses `envsubst` for environment variable substitution. You can define additional environment variables in `nginx.conf` as `${var}` and pass them in your `docker-compose` file or `docker` command.
50 |
51 |
52 | ### Custom `nginx.conf`
53 | If you wish to use your own `nginx.conf`, mount it as a volume in your `docker-compose` or `docker` command as `nginx.conf.template`:
54 | ```yaml
55 | volumes:
56 | - ./nginx.conf:/etc/nginx/nginx.conf.template
57 | ```
58 |
59 | ### OBS Configuration
60 | * Stream Type: `Custom Streaming Server`
61 | * URL: `rtmp://localhost:1935/stream`
62 | * Stream Key: `hello`
63 |
64 | ### Watch Stream
65 | * Load up the example hls.js player in your browser:
66 | ```
67 | http://localhost:8080/player.html?url=http://localhost:8080/live/hello.m3u8
68 | ```
69 |
70 | * Or in Safari, VLC or any HLS player, open:
71 | ```
72 | http://localhost:8080/live/$STREAM_NAME.m3u8
73 | ```
74 | * Example Playlist: `http://localhost:8080/live/hello.m3u8`
75 | * [HLS.js Player](https://hls-js.netlify.app/demo/?src=http%3A%2F%2Flocalhost%3A8080%2Flive%2Fhello.m3u8)
76 | * FFplay: `ffplay -fflags nobuffer rtmp://localhost:1935/stream/hello`
77 |
78 | ### FFmpeg Build
79 | ```
80 | $ ffmpeg -buildconf
81 |
82 | ffmpeg version 4.4 Copyright (c) 2000-2021 the FFmpeg developers
83 | built with gcc 10.2.1 (Alpine 10.2.1_pre1) 20201203
84 | configuration: --prefix=/usr/local --enable-version3 --enable-gpl --enable-nonfree --enable-small --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libvpx --enable-libtheora --enable-libvorbis --enable-libopus --enable-libfdk-aac --enable-libass --enable-libwebp --enable-postproc --enable-avresample --enable-libfreetype --enable-openssl --disable-debug --disable-doc --disable-ffplay --extra-libs='-lpthread -lm'
85 | libavutil 56. 70.100 / 56. 70.100
86 | libavcodec 58.134.100 / 58.134.100
87 | libavformat 58. 76.100 / 58. 76.100
88 | libavdevice 58. 13.100 / 58. 13.100
89 | libavfilter 7.110.100 / 7.110.100
90 | libavresample 4. 0. 0 / 4. 0. 0
91 | libswscale 5. 9.100 / 5. 9.100
92 | libswresample 3. 9.100 / 3. 9.100
93 | libpostproc 55. 9.100 / 55. 9.100
94 |
95 | configuration:
96 | --prefix=/usr/local
97 | --enable-version3
98 | --enable-gpl
99 | --enable-nonfree
100 | --enable-small
101 | --enable-libmp3lame
102 | --enable-libx264
103 | --enable-libx265
104 | --enable-libvpx
105 | --enable-libtheora
106 | --enable-libvorbis
107 | --enable-libopus
108 | --enable-libfdk-aac
109 | --enable-libass
110 | --enable-libwebp
111 | --enable-postproc
112 | --enable-avresample
113 | --enable-libfreetype
114 | --enable-openssl
115 | --disable-debug
116 | --disable-doc
117 | --disable-ffplay
118 | --extra-libs='-lpthread -lm'
119 | ```
120 |
121 |
122 | ### FFmpeg Hardware Acceleration
123 | A `Dockerfile.cuda` image is available to enable FFmpeg hardware acceleration via the [NVIDIA's CUDA](https://trac.ffmpeg.org/wiki/HWAccelIntro#CUDANVENCNVDEC).
124 |
125 | Use the tag: `alfg/nginx-rtmp:cuda`:
126 | ```
127 | docker run -it -p 1935:1935 -p 8080:80 --rm alfg/nginx-rtmp:cuda
128 | ```
129 |
130 | You must have a supported platform and driver to run this image.
131 |
132 | * https://github.com/NVIDIA/nvidia-docker
133 | * https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker
134 | * https://docs.docker.com/docker-for-windows/wsl/
135 | * https://trac.ffmpeg.org/wiki/HWAccelIntro#CUDANVENCNVDEC
136 |
137 | **This image is experimental!*
138 |
139 | ## Resources
140 | * https://alpinelinux.org/
141 | * http://nginx.org
142 | * https://github.com/arut/nginx-rtmp-module
143 | * https://www.ffmpeg.org
144 | * https://obsproject.com
145 |
--------------------------------------------------------------------------------
/static/stat.xsl:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | RTMP statistics
16 |
17 |
18 |
19 |
20 | Generated by
21 | nginx-rtmp-module ,
22 | nginx ,
23 | pid ,
24 | built
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | | RTMP |
33 | #clients |
34 | Video |
35 | Audio |
36 | In bytes |
37 | Out bytes |
38 | In bits/s |
39 | Out bits/s |
40 | State |
41 | Time |
42 |
43 |
44 | | Accepted: |
45 | codec |
46 | bits/s |
47 | size |
48 | fps |
49 | codec |
50 | bits/s |
51 | freq |
52 | chan |
53 |
54 |
55 |
56 |
57 | |
58 |
59 |
60 |
61 |
62 | |
63 |
64 |
65 |
66 |
67 |
68 |
69 | |
70 |
71 |
72 |
73 |
74 |
75 |
76 | |
77 | |
78 |
79 |
80 |
81 |
82 | |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 | |
95 |
96 | |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | |
105 | live streams
106 | |
107 |
108 |
109 | |
110 |
111 |
112 |
113 |
114 |
115 |
116 | |
117 | vod streams
118 | |
119 |
120 |
121 | |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 | #cccccc
131 | #dddddd
132 |
133 |
134 | |
135 |
136 |
137 | var d=document.getElementById('-');
138 | d.style.display=d.style.display=='none'?'':'none';
139 | return false
140 |
141 |
142 |
143 | [EMPTY]
144 |
145 |
146 | |
147 | |
148 |
149 |
150 | |
151 |
152 |
153 |
154 |
155 |
156 |
157 | |
158 |
159 |
160 | |
161 |
162 |
163 | |
164 |
165 |
166 | |
167 |
168 |
169 |
170 |
171 |
172 |
173 | |
174 |
175 |
176 | |
177 |
178 |
179 | |
180 |
181 |
182 |
183 |
184 | |
185 |
186 |
187 |
188 |
189 | |
190 |
191 |
192 |
193 |
194 |
195 |
196 | |
197 |
198 |
199 |
200 |
201 |
202 |
203 | |
204 | |
205 |
206 |
207 |
208 |
209 | |
210 |
211 |
212 |
213 | -
214 |
215 |
216 |
217 |
218 | | Id |
219 | State |
220 | Address |
221 | Flash version |
222 | Page URL |
223 | SWF URL |
224 | Dropped |
225 | Timestamp |
226 | A-V |
227 | Time |
228 |
229 |
230 |
231 | |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 | d
245 |
246 |
247 |
248 | h
249 |
250 |
251 |
252 | m
253 |
254 |
255 | s
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 | T
269 |
270 |
271 | G
272 |
273 |
274 | M
275 |
276 | K
277 |
278 |
279 |
280 | b
281 | B
282 |
283 | /s
284 |
285 |
286 |
287 |
288 |
289 | active
290 | idle
291 |
292 |
293 |
294 |
295 |
296 |
297 | publishing
298 | playing
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 | #cccccc
308 | #eeeeee
309 |
310 |
311 | |
312 | |
313 |
314 |
315 |
316 | http://apps.db.ripe.net/search/query.html?searchtext=
317 |
318 | whois
319 |
320 |
321 | |
322 | |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 | |
331 | |
332 | |
333 | |
334 | |
335 |
336 |
337 |
338 |
339 | |
340 |
341 |
342 |
343 |
344 | publishing
345 |
346 |
347 |
348 | active
349 |
350 |
351 |
352 | x
353 |
354 |
355 |
356 |
--------------------------------------------------------------------------------