= 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)