Skip to content
NGINX-based Media Streaming Server
C XSLT Other
Branch: master
Clone or download
arut Merge pull request #1125 from martynjarvis/fall-through-comments
Add  "fall through" comments to stop GCC 7 complaining
Latest commit 791b613 Nov 29, 2017
Type Name Latest commit message Commit time
Failed to load latest commit information.
dash Set DASH fragment max duration and fixed manifest. Jul 10, 2017
doc added documentation link Nov 28, 2012
hls Add "fall through" comments Sep 28, 2017
test removed trailing space Nov 30, 2013
AUTHORS improved frame timing & added meta files Mar 19, 2012
LICENSE updated year Jan 15, 2014 Use same path in the comments and in the code Jan 31, 2014
config fixed rtmp as a dynamic module Aug 9, 2016
ngx_rtmp.c fixed rtmp as a dynamic module Aug 9, 2016
ngx_rtmp.h Set max RTMP chunk size. Jun 1, 2017
ngx_rtmp_access_module.c Add "fall through" comments Sep 28, 2017
ngx_rtmp_amf.c Add "fall through" comments Sep 28, 2017
ngx_rtmp_amf.h updated copyright line Nov 3, 2013
ngx_rtmp_auto_push_module.c fixed rtmp as a dynamic module Aug 9, 2016
ngx_rtmp_bandwidth.c removed trailing spaces Nov 30, 2013
ngx_rtmp_bandwidth.h added audio and video bw to stat Dec 23, 2013
ngx_rtmp_bitop.c implemented avc sps parser & improved dash & stats Dec 20, 2013
ngx_rtmp_bitop.h implemented avc sps parser & improved dash & stats Dec 20, 2013
ngx_rtmp_cmd_module.c implemented play2 time continuation Feb 3, 2014
ngx_rtmp_cmd_module.h shared fill args func Jan 2, 2014
ngx_rtmp_codec_module.c fixed windows compilation Dec 23, 2013
ngx_rtmp_codec_module.h added aac-he & aac-hev2 support Dec 21, 2013
ngx_rtmp_control_module.c fixed errors in control output; now returning http 206 instead of emp… Mar 4, 2014
ngx_rtmp_core_module.c fixed rtmp as a dynamic module Aug 9, 2016
ngx_rtmp_eval.c Add "fall through" comments Sep 28, 2017
ngx_rtmp_eval.h merged exec pull feature Nov 26, 2013
ngx_rtmp_exec_module.c added filename, basename & dirname to exec_record_done Jan 12, 2014
ngx_rtmp_handler.c Set max RTMP chunk size. Jun 1, 2017
ngx_rtmp_handshake.c OpenSSL-1.1 support Feb 13, 2017
ngx_rtmp_init.c Add "fall through" comments Sep 28, 2017
ngx_rtmp_limit_module.c removed trailing spaces Nov 30, 2013
ngx_rtmp_live_module.c reverted changes in live module Jan 10, 2014
ngx_rtmp_live_module.h reverted changes in live module Jan 10, 2014
ngx_rtmp_log_module.c fixed issue with multiple access_logs Sep 9, 2014
ngx_rtmp_mp4_module.c fixed skipping first key frame in mp4 streamer Apr 24, 2014
ngx_rtmp_netcall_module.c added clientid to notifications & control Jan 16, 2014
ngx_rtmp_netcall_module.h removed trailing spaces Nov 30, 2013
ngx_rtmp_notify_module.c Add "fall through" comments Sep 28, 2017
ngx_rtmp_play_module.c fixed compilation Sep 17, 2014
ngx_rtmp_play_module.h removed trailing spaces Nov 30, 2013
ngx_rtmp_proxy_protocol.c fixed compilation with old nginx Apr 3, 2014
ngx_rtmp_proxy_protocol.h added proxy protocol support Mar 31, 2014
ngx_rtmp_record_module.c fixed rtmp as a dynamic module Aug 9, 2016
ngx_rtmp_record_module.h recorder now writes correct flv track mask Jan 20, 2014
ngx_rtmp_relay_module.c enabled static relay cleanup to fix static_relay+auto_push combination Sep 23, 2014
ngx_rtmp_relay_module.h removed trailing spaces Nov 30, 2013
ngx_rtmp_send.c removed trailing spaces Nov 30, 2013
ngx_rtmp_shared.c removed trailing spaces Nov 30, 2013
ngx_rtmp_stat_module.c fixed formatting error in stat module Jan 5, 2014
ngx_rtmp_streams.h updated copyright line Nov 3, 2013
ngx_rtmp_version.h version bump Apr 3, 2014
stat.xsl moved bytes/bw block to the right of stat page Dec 23, 2013

NGINX-based Media Streaming Server


Project blog

Wiki manual

Google group (Russian)

Donation page (Paypal etc)


  • RTMP/HLS/MPEG-DASH live streaming

  • RTMP Video on demand FLV/MP4, playing from local filesystem or HTTP

  • Stream relay support for distributed streaming: push & pull models

  • Recording streams in multiple FLVs

  • H264/AAC support

  • Online transcoding with FFmpeg

  • HTTP callbacks (publish/play/record/update etc)

  • Running external programs on certain events (exec)

  • HTTP control module for recording audio/video and dropping clients

  • Advanced buffering techniques to keep memory allocations at a minimum level for faster streaming and low memory footprint

  • Proved to work with Wirecast, FMS, Wowza, JWPlayer, FlowPlayer, StrobeMediaPlayback, ffmpeg, avconv, rtmpdump, flvstreamer and many more

  • Statistics in XML/XSL in machine- & human- readable form

  • Linux/FreeBSD/MacOS/Windows


cd to NGINX source directory & run this:

./configure --add-module=/path/to/nginx-rtmp-module
make install

Several versions of nginx (1.3.14 - 1.5.0) require http_ssl_module to be added as well:

./configure --add-module=/path/to/nginx-rtmp-module --with-http_ssl_module

For building debug version of nginx add --with-debug

./configure --add-module=/path/to-nginx/rtmp-module --with-debug

Read more about debug log

Windows limitations

Windows support is limited. These features are not supported

  • execs
  • static pulls
  • auto_push

RTMP URL format


app - should match one of application {} blocks in config

name - interpreted by each application can be empty

Multi-worker live streaming

Module supports multi-worker live streaming through automatic stream pushing to nginx workers. This option is toggled with rtmp_auto_push directive.

Example nginx.conf

rtmp {

    server {

        listen 1935;

        chunk_size 4000;

        # TV mode: one publisher, many subscribers
        application mytv {

            # enable live streaming
            live on;

            # record first 1K of stream
            record all;
            record_path /tmp/av;
            record_max_size 1K;

            # append current timestamp to each flv
            record_unique on;

            # publish only from localhost
            allow publish;
            deny publish all;

            #allow play all;

        # Transcoding (ffmpeg needed)
        application big {
            live on;

            # On every pusblished stream run this command (ffmpeg)
            # with substitutions: $app/${app}, $name/${name} for application & stream name.
            # This ffmpeg call receives stream from this application &
            # reduces the resolution down to 32x32. The stream is the published to
            # 'small' application (see below) under the same name.
            # ffmpeg can do anything with the stream like video/audio
            # transcoding, resizing, altering container/codec params etc
            # Multiple exec lines can be specified.

            exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
                        -f flv rtmp://localhost:1935/small/${name};

        application small {
            live on;
            # Video with reduced resolution comes here from ffmpeg

        application webcam {
            live on;

            # Stream from local webcam
            exec_static ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an
                               -f flv rtmp://localhost:1935/webcam/mystream;

        application mypush {
            live on;

            # Every stream published here
            # is automatically pushed to
            # these two machines

        application mypull {
            live on;

            # Pull all streams from remote machine
            # and play locally
            pull rtmp://;

        application mystaticpull {
            live on;

            # Static pull is started at nginx start
            pull rtmp:// name=mystream static;

        # video on demand
        application vod {
            play /var/flvs;

        application vod2 {
            play /var/mp4s;

        # Many publishers, many subscribers
        # no checks, no recording
        application videochat {

            live on;

            # The following notifications receive all
            # the session variables as well as
            # particular call arguments in HTTP POST
            # request

            # Make HTTP request & use HTTP retcode
            # to decide whether to allow publishing
            # from this connection or not
            on_publish http://localhost:8080/publish;

            # Same with playing
            on_play http://localhost:8080/play;

            # Publish/play end (repeats on disconnect)
            on_done http://localhost:8080/done;

            # All above mentioned notifications receive
            # standard connect() arguments as well as
            # play/publish ones. If any arguments are sent
            # with GET-style syntax to play & publish
            # these are also included.
            # Example URL:
            #   rtmp://localhost/myapp/mystream?a=b&c=d

            # record 10 video keyframes (no audio) every 2 minutes
            record keyframes;
            record_path /tmp/vc;
            record_max_frames 10;
            record_interval 2m;

            # Async notify about an flv recorded
            on_record_done http://localhost:8080/record_done;


        # HLS

        # For HLS to work please create a directory in tmpfs (/tmp/hls here)
        # for the fragments. The directory contents is served via HTTP (see
        # http{} section in config)
        # Incoming stream must be in H264/AAC. For iPhones use baseline H264
        # profile (see ffmpeg example).
        # This example creates RTMP stream from movie ready for HLS:
        # ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264
        #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
        #    -f flv rtmp://localhost:1935/hls/movie
        # If you need to transcode live stream use 'exec' feature.
        application hls {
            live on;
            hls on;
            hls_path /tmp/hls;

        # MPEG-DASH is similar to HLS

        application dash {
            live on;
            dash on;
            dash_path /tmp/dash;

# HTTP can be used for accessing RTMP stats
http {

    server {

        listen      8080;

        # This URL provides RTMP statistics in XML
        location /stat {
            rtmp_stat all;

            # Use this stylesheet to view XML as web page
            # in browser
            rtmp_stat_stylesheet stat.xsl;

        location /stat.xsl {
            # XML stylesheet to view RTMP stats.
            # Copy stat.xsl wherever you want
            # and put the full directory path here
            root /path/to/stat.xsl/;

        location /hls {
            # Serve HLS fragments
            types {
                application/ m3u8;
                video/mp2t ts;
            root /tmp;
            add_header Cache-Control no-cache;

        location /dash {
            # Serve DASH fragments
            root /tmp;
            add_header Cache-Control no-cache;

Multi-worker streaming example

rtmp_auto_push on;

rtmp {
    server {
        listen 1935;

        application mytv {
            live on;
You can’t perform that action at this time.