Live HLS Dynamic Bitrate Streaming

Beim nginx wird im rtmp-Kontext eine Applikation src erstellt, die gleich zu live-rtmp-dynamic-bitrate ist. Weiteres dort.

In der Applikation stream wird den verschiedenen Varianten die Bandbreite mitgeteilt. Diese berechnet sich aus der Video- + Audio-Bandbreite. Dadurch werden .m3u8-Playlists pro Variante erstellt, die in /tmp/hls/$name_variant/index.m3u8 abgelegt werden. Ebenso wird eine “globale” .m3u8-Playlist für den Stream an sich in /tmp/hls/$name.m3u8 erstellt, die auf die Varianten-Playlists verweist.

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;
hls on;
hls_nested on;
hls_path /tmp/hls;
hls_fragment 5s;
hls_variant _low BANDWIDTH=144000;
hls_variant _mid BANDWIDTH=288000;
hls_variant _hi BANDWIDTH=576000;
hls_variant _full BANDWIDTH=864000;
}

#EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=144000 aljazeera_low/index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=288000 aljazeera_mid/index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=576000 aljazeera_hi/index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=864000 aljazeera_full/index.m3u8
#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:575 #EXT-X-TARGETDURATION:7 #EXTINF:5.760, 575.ts #EXTINF:6.560, 576.ts #EXTINF:5.320, 577.ts #EXTINF:5.560, 578.ts #EXTINF:6.800, 579.ts #EXTINF:5.080, 580.ts

Im http-Kontext des nginx wird die Location /hls benötigt, die auf /tmp/hls zeigt. Dieses sollte als tmpfs erzeugt sein.

Der Stream kann nun über http://stream.konvergenzfehler.de/hls/aljazeera.m3u8 abgerufen werden. Am besten ist es, diesen mit einem HLS-fähigen Endgerät (iPhone, iPad) anzuschauen, da dort erkennbar ist, wie erst die schlechteste Qualität abgerufen und dann hoch skaliert wird.