Live RTMP Dynamic Bitrate Streaming

Im rtmp-Kontext von nginx wird eine Applikation src benötigt, die die Videos in die verschiedenen Varianten umkodiert. Das ist gleich zu Live HLS Dynamic Bitrate. Dort werden mit pull Videos von externen Quellen “rein gezogen”. Mit dem Flag static wird der Stream bereit gestellt, ohne dass ein RTMP-Player darauf dynamisch zugreifen braucht. Es kann auch in die src Applikation ein eigenes Video rein gestreamt werden statt mit pull von einer anderen Quelle zu ziehen. Diese Applikation kann mit den üblichen nginx Regeln für allow und deny eingeschränkt werden, dass z.B. nur bestimmte IP-Adressen darauf zugreifen können.

Die Streams werden mittels ffmpeg in diverse Größen und Bitraten umkodiert. Das braucht CPU-Last. Das Ergebnis wird in die Applikation stream rein gestreamt. Die Namen sind die des pull-Streams plus eine Kennung für die Variante.Die Applikation stream ist dagegen sehr simpel, da kein HLS benötigt wird.

application src {
live on;
sync 50ms;
pull rtmp://cp76072.live.edgefcs.net/live/EDU-HQ-Flash@42809 app=live playPath=EDU-HQ-Flash@42809 name=nasa;
pull rtmp://aljazeeraflashlivefs.fplive.net:1935/aljazeeraflashlive-live/aljazeera_eng_high app=aljazeeraflashlive-live playPath=aljazeera_eng_high name=aljazeera static;
exec /usr/bin/ffmpeg -i rtmp://localhost:1935/src/${name}
-c:a libfdk_aac -b:a 16k -c:v libx264 -b:v 128K -f flv -s 160x90 rtmp://localhost/stream/$name_low
-c:a libfdk_aac -b:a 32k -c:v libx264 -b:v 256K -f flv -s 320x180 rtmp://localhost/stream/$name_mid
-c:a libfdk_aac -b:a 64k -c:v libx264 -b:v 512K -f flv -s 640x360 rtmp://localhost/stream/$name_hi
-c:a copy -b:a copy -c:v copy -b:v copy -f flv rtmp://localhost/stream/$name_full;
}
application stream {
live on;
}

Es kann nun eine .smil-Datei mit den verschiedenen Varianten erstellt werden, die auf die verschiedenen Streams zeigt. Diese Datei muss im http-Kontext vom nginx abgelegt werden, sodass sie per HTTP geladen werden kann (im Beispiel wird die _full-Variante nicht verwendet). Die meisten Player zeigen den Eintrag von height in einem Dropdown-Feld an.

<smil> <head> <meta base="rtmp://109.68.228.120/stream/" /> </head> <body> <switch> <video src="aljazeera_hi" system-bitrate="576000" width="640" height="360" /> <video src="aljazeera_mid" system-bitrate="288000" width="320" height="180" /> <video src="aljazeera_low" system-bitrate="144000" width="180" height="90" /> </switch> </body> </smil>

Beispiel unter http://stream.konvergenzfehler.de/player/jwplayer/nginx-test.html und dort den Aljazeera Dynamic Bitrate Stream. Sollte dieser nicht direkt klappen, dann den local src Stream erstmal auswählen, damit der Server anfängt, den Stream zu pullen.