Initialize project
This commit is contained in:
commit
5c055c1b16
|
@ -0,0 +1,6 @@
|
||||||
|
FROM alqutami/rtmp-hls:latest-alpine
|
||||||
|
|
||||||
|
COPY ./player/index.html /usr/local/nginx/html/
|
||||||
|
COPY ./player/video* /usr/local/nginx/html/
|
||||||
|
|
||||||
|
RUN rm -rf /usr/local/nginx/html/players/
|
|
@ -0,0 +1,6 @@
|
||||||
|
#/bin/bash
|
||||||
|
|
||||||
|
source .env
|
||||||
|
|
||||||
|
$DOCKER build -t stream_docker .
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
PORT=1936
|
||||||
|
PORT2=8080
|
||||||
|
|
||||||
|
if [[ "${1}" != "" ]]; then
|
||||||
|
PORT=${1}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${2}" != "" ]]; then
|
||||||
|
PORT2=${2}
|
||||||
|
fi
|
||||||
|
|
||||||
|
source .env
|
||||||
|
|
||||||
|
$DOCKER run --rm -it \
|
||||||
|
-p $PORT:1935 \
|
||||||
|
-p $PORT2:8080 \
|
||||||
|
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \
|
||||||
|
--name stream_docker \
|
||||||
|
stream_docker
|
|
@ -0,0 +1,135 @@
|
||||||
|
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
|
||||||
|
allow publish all;
|
||||||
|
#deny play all;
|
||||||
|
|
||||||
|
# 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/local/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;
|
||||||
|
drop_idle_publisher 10s;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
|
||||||
|
include mime.types;
|
||||||
|
|
||||||
|
# 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/local/nginx/html;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Stream</title>
|
||||||
|
<link href="/video-js.css" rel="stylesheet">
|
||||||
|
<script src="/video.js"></script>
|
||||||
|
<style>
|
||||||
|
html,body{background: black; min-height: 100vh; min-width: 100vw;}
|
||||||
|
body{overflow: hidden;}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<center>
|
||||||
|
<video id="player" class="video-js vjs-default-skin" width="720" controls preload="auto">
|
||||||
|
<source src="/hls/test.m3u8" type="application/x-mpegURL" />
|
||||||
|
</video>
|
||||||
|
</center>
|
||||||
|
<script>
|
||||||
|
var player = videojs('#player');
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,29 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source .env
|
||||||
|
|
||||||
|
WIDTH=1280
|
||||||
|
HEIGHT=720
|
||||||
|
|
||||||
|
W=$WIDTH
|
||||||
|
H=$HEIGHT
|
||||||
|
|
||||||
|
CMD="echo hello"
|
||||||
|
|
||||||
|
$DOCKER run --name ffmpeg_stream_$(date +%s) jrottenberg/ffmpeg:4.1-scratch \
|
||||||
|
-stats \
|
||||||
|
-i http://archive.org/download/thethreeagesbusterkeaton/Buster.Keaton.The.Three.Ages.ogv \
|
||||||
|
-c:v libx264 \
|
||||||
|
-preset ultrafast \
|
||||||
|
-tune zerolatency \
|
||||||
|
-maxrate 2048k \
|
||||||
|
-bufsize 4096k \
|
||||||
|
-pix_fmt yuv420p \
|
||||||
|
-vf "scale=${W}:${H}:force_original_aspect_ratio=decrease,pad=${W}:${H}:(ow-iw)/2:(oh-ih)/2" \
|
||||||
|
-g 60 \
|
||||||
|
-c:a aac \
|
||||||
|
-b:a 190k \
|
||||||
|
-ac 2 \
|
||||||
|
-ar 44100 \
|
||||||
|
-f flv \
|
||||||
|
rtmp://$(hostname -I | awk '{print $1}'):1935/live/test
|
Loading…
Reference in New Issue