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.

  • events/30c3/cdn/live-hls-dynamic-bitrate.1458639609.txt.gz
  • Last modified: 2016/03/22 10:40
  • by v0tti