├── .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 |
29 |

hls.js player

30 | github.com/video-dev/hls.js 31 |
32 | 33 |
34 |
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 | MIIJRQIBADANBgkqhkiG9w0BAQEFAASCCS8wggkrAgEAAoICAQC/ZbN2LDeSDDxR 3 | IOlfFRJVu/h8ygaZ/Y+1yNmfqdJ0ad1kGm3Y4PFhG/NMWsC4v3jgMJBjky4NELvP 4 | myIUdR7Xitq9FNq+Ozn4qvld6VU3TCh+AynY2mD7rFeVPi39xvhPzyGqbdQyfQBy 5 | gAP0vyhkKz7hocjA1lPy22zlxtx6cnE2t0WuLbwv5DmzHkKs56hA/xHULTXPdpdj 6 | NBdn3vD2GvfkEGTNFW3ia+L0vkIsDOVXGf/i8bL+1XU8BtBowUFZHaCPM0rHT4Mp 7 | yzPWEqjtReLctV8kCf3GZzB9BylYQfvgQiQukDJD+gWuFlL8j44IK6HXdsoQh8Jj 8 | QgI3a7tqBMGHNudZeQX0IpvYSUol3UL3qbJaYeYlPwZ3fiXv+8phdBQad2z7bI3a 9 | F5mPf/R4Jyrc+/oNyCOgGRgQnflnaNWr/Dfxwl4DDZ3sKsYmV8GuaLe/ZZJceNGe 10 | 9T29VOA3+YU11NAsp4wceJk+Ir3WePVQQRxeEBgvvfUfEn5dv9bHk474qLS8vcZ1 11 | AlCvwG1bm2lJRgmCIu+n50hRJPwgGjWzrDkO1yqaljXbngCAaM0teu6rqO4ZuBUF 12 | EuGahTSvzGxE6mugC+135ud6P3SFwd+q+CyD37w222umKBE8cdtjuITlv2nbhdts 13 | dWFMnuG1Di324n8j3v0DVK0sGep8PwIDAQABAoICAQCNPFYeyOhE7KSB1YCAuoLq 14 | IyhtpYMTlUm8AjedG2sCnrBRUzNmDC/y0fZKjNmUOy7OeOfDovMjjwqYW0jdwcN9 15 | mKhrSP1VzUytFDWpuCo7AQcMXfc+X3+bmASVS+oSUAYilp2oLx2cGCQBWjgRHhKH 16 | QGZJh+IlcsNF/eew83r1HIgwsTNJIdSxnn95jsXy44uEUvTsFmST8FYsTV9MNfao 17 | FSSB9hr8P2jz4Vr78X3RFb8S9EugQ20roYa+QeT+uEUpprQ5l8cBpsoKSDm7Kc/g 18 | L2cGKQzJAlpzUug0CtnWl/Ju/T/H4H5HLTON0Elyt9g+bTwjTDQ12Ih4SFhsXyJP 19 | Bbhvv9lMB7Q2vvQz4VG3xwqB2IguT/tZeNYRyN3dFHq/Ib2Rt6jtyJ3qUNBXFdr/ 20 | Q1KNsgWBvpMiB0OKpakDWQMUIsuRHL1EcWnBIOURl0Xj90wYgkIr0czH6KoxLzaO 21 | qkSmIDN/tsoHfJ5LXsrVmAMS2OaGRK5rt0pfF6a2Tl0zaWSlwT0v/ymVjavmFxyl 22 | oCDhaoQ9fh7OBjf6vX2AYtwr1Dbo/578t+/0eUZOlYMNnomi0FudEoVi7IMQv82f 23 | OFnVTXjdHJHyvfBjhWqbjw1oQTBtrgMJSUMqaqvTgA0k/rppfMUuXS1B7Dl0c0LU 24 | w1FHDk78I+IZBxIXSyVmQQKCAQEA5oVlwJxXLb9bNqbcKipKrQQAcPAgXt7ZOQOL 25 | l28K74N+3IylQFH9HBIE6QLrjOZFTKh0kLcrYfGhz7RoATkBJkf3w6F9Ef3F6Epp 26 | X7ygPFFggGdx5csQzOCrK4VQGMEM9T4Zn5FEbCKhrica6g/u2WaLbq7XzwYXCVjH 27 | GKqSpTZXfecfcSQHkjoGGcQqnXMkOE+w/HF21Wn6BHxfBUYsrPsB54ZkITPkNdjX 28 | xZq+t331pFH1P2X//ogBKXp/5ZYRd8pR0dysGo9e1U91OLgjcQXU9y2MzNajp6j/ 29 | o9czZi3xc1P2j0/mJdoCebr9C7erZa2mmTnXITNIgEhpFwlYHwKCAQEA1I1LNehc 30 | ClgZw9/sPP4cB7ONAyVRHgAzhM8/hfjN/NDAbMkYWYwGDPYOIuxf9Vo34XX1GhQo 31 | 4ctb/DZHGsVcBFIVD7fPj60D3yC2HvcGlZ2sgHBG0RwftYentQWvutxRGWcN9A1+ 32 | Gcn379MWp3SsqjMN1JM1RzEPvr9SO3fQOPIAaMjpOwWxeopsVvVzEzhQ6IqsFUkA 33 | UR1q0noKExb3Re1eSDzuuBo1ftWm9sXbH6eilvNvOD3MYApOJ2aJRPdRDPVCyHID 34 | 8rpJyngpKTIuUGax53pB2mJ4Af5aPNuwIC0JLxgFmYYNLvJ5o4FWWiFcjHYS7728 35 | UEjzETBm0A7X4QKCAQEAw29RBu0FFCnpoPnyKmVUjj6YSSerqgLw0t9ol2hzMwCe 36 | q0kqSM+58PRt6UaqgPgwxH8E5DQGubDr6HYgvvifOt9E9TySFpC6GugLUjlO+BRd 37 | 5j7NV27DvY60T99kOrhgzgJqItg71BnATS+mJ85+Rx4jFCFzoXaeTTRRB16FmT/r 38 | CTjLdVaAfL5osauYHYiiqoMVn9BqWSDR8L+op4YJFlZwFOPhPC0MS4Kd3FAHZPWL 39 | Lla1v5wwXpDbu1i52eFSyeZjW7LkzlfCpMIKtZ2Xnpi9JxodBwTqFpi2sycd0oEc 40 | 9RO4M2Qf0PN1qdKX+jkrPLbuSXW6J9Gco/W/8uHfLQKCAQEAvRB9oRLxpAXfzTrG 41 | US6bUkJlITI1aGE3cmBDGfFJkSNCtsFdlnGWBDtuMaReasj4QeWBwtPB1a7lQIAr 42 | WWXKRtGYiGWxDBUTB4t6VCrZQYaCJbE5XNIOZpOnGr9XI/jLbrQbVkYWL+xWTY5P 43 | bV68I5zMJZVX496BKePWyqz1m2Gv+YUU6PpUdzLf0a380VDbry2CimBoFr77AQOr 44 | KHXaN+o/XjRNB5fQk+SJ4qH2Gr8rQeiBut5Fh/xCrotneOAgyUz0PYYleug3sRCX 45 | VFydk8j1YHiAUTgblXJhZBbqIITO0YQlnvz9hxAKIOVwITXhs9NnXrc/5Y4uH9EU 46 | 8ubxIQKCAQEA5fWcnr3UM6hDH0ixPD+CMrCggvcK+/uOYLwsN8Lm6P9zNu2MxhYe 47 | bwACFyfG+ArdFD9G72X0tf7DDiyGdlWR6AB5tzbP3d9UB14DW9s47YD1w5yqtAHI 48 | pbFevd0O9PFYf0+290Gh0fKGW5GkfRj+1ZiOfqfGtscWufjpdYeCjs0WzZDy7jGm 49 | SG6sgk8Mar65fYWOoo0o9jD+hLzAtf8O0KE+Ilevb4UgqBc1WzdTy21KW65r+Guv 50 | 7rJFrGuHERHFFR7mxgNyWFVRw2eysxhOQHe/2nnJSyDIjaKEiiaKJJ2FUqnRVr6Q 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 | [![Docker Stars](https://img.shields.io/docker/stars/alfg/nginx-rtmp.svg)](https://hub.docker.com/r/alfg/nginx-rtmp/) 11 | [![Docker Pulls](https://img.shields.io/docker/pulls/alfg/nginx-rtmp.svg)](https://hub.docker.com/r/alfg/nginx-rtmp/) 12 | [![Docker Automated build](https://img.shields.io/docker/automated/alfg/nginx-rtmp.svg)](https://hub.docker.com/r/alfg/nginx-rtmp/builds/) 13 | [![Build Status](https://travis-ci.org/alfg/docker-nginx-rtmp.svg?branch=master)](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 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 58 | 63 | 70 | 77 | 83 | 84 | 85 |
RTMP#clientsVideoAudioIn bytesOut bytesIn bits/sOut bits/sStateTime
Accepted: codecbits/ssizefpscodecbits/sfreqchan 54 | 55 | 56 | 57 | 59 | 60 | 61 | 62 | 64 | 65 | 66 | 67 | 68 | 69 | 71 | 72 | 73 | 74 | 75 | 76 | 78 | 79 | 80 | 81 | 82 |
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 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 |
IdStateAddressFlash versionPage URLSWF URLDroppedTimestampA-VTime
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 | --------------------------------------------------------------------------------