= nginx-rtmp-module
== debian pakete
apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev libbz2-dev libssl-dev tar unzip
== compile
./configure --add-module=../nginx-rtmp-module --with-ipv6 --with-http_stub_status_module
== rtmp
/usr/local/nginx/conf/nginx.conf:
user www-data;
# multiple worker
worker_processes 2;
# important for multi worker processes!!1!
rtmp_auto_push on;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
}
http {
server {
listen [::]:80 default ipv6only=off;
root /srv/nginx/htdocs;
index index.html index.htm;
server_name localhost;
# html page stuff
location / {
try_files $uri $uri/ /index.html;
}
location /releases {
alias /srv/releases;
autoindex on;
}
location /releases/private {
alias /srv/releases/private;
auth_basic "Auf zum Atem!!1!";
auth_basic_user_file /etc/nginx/releases_htpasswd;
autoindex on;
}
# hls
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /tmp/hls;
autoindex on;
}
# stats
location /stats/rtmp {
rtmp_stat all;
allow 127.0.0.1;
allow 195.54.164.160/29; # berlin
allow 188.40.235.220; # oglarun → meise
deny all;
}
location /stats/nginx {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 195.54.164.160/29; # berlin
allow 188.40.235.220; # oglarun → meise
deny all;
}
}
}
rtmp {
server {
listen [::]:1935 ipv6only=off;
ping 30s;
# Disable audio until first video frame is sent.
wait_video on;
# Send NetStream.Publish.Start and NetStream.Publish.Stop to subscribers.
publish_notify on;
# Synchronize audio and video streams. If subscriber bandwidth is not
# enough to receive data at ublisher rate some frames are dropped by
# server. This leads to synchronization problem. When timestamp
# difference exceeds the value specified as sync argument an absolute
# frame is sent fixing that. Default is 300ms.
sync 10ms;
application stream {
# enable live streaming
live on;
meta copy;
hls on;
hls_path /tmp/hls;
hls_fragment 5;
# publish only from localhost
allow publish 127.0.0.1;
deny publish all;
allow play all;
}
}
}
ffmpeg push:
ffmpeg -re -i catcontent.ogg -threads 0 -pix_fmt yuv420p -profile:v baseline -preset fast -tune zerolatency -c:v libx264 -strict -2 -c:a aac -f flv rtmp://localhost:1935/stream/katze
== hls
/usr/local/nginx/conf/nginx.conf:
→ siehe Abschnitt hls und http in der rtmp Konfiguration.
ffmpeg push:
ffmpeg -re -i catcontent.ogg -threads 0 -pix_fmt yuv420p -profile:v baseline -preset fast -tune zerolatency -c:v libx264 -strict -2 -c:a aac -f flv rtmp://localhost:1935/stream/katze
* Das Verhaeltnis aus Segmentlaenge, m3u8 cache duration und Kaskadentiefe war falsch. Die cache-duration muss < segment-laenge / 2 sein, bei 2 Cache-Stufen (wie bei uns) / 8. Fixed durch Setzen der Segmentlaenge auf 10s. (Unsere m3u8 cache-duration war und ist 1s)