Live HLS Dynamic Bitrate Streaming

Beim nginx wird im rtmp-Kontext eine Applikation src erstellt, die gleich zu Live RTMP Dynamic Bitrate Streaming 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.