Go to file
Jan Alexander Steffens (heftig) 1c3dc989ef
Work around deletion of still-needed init segments
I assume they get accidentally deleted right after they're
written, before the playlist is first created.

Leave them around for another cleanup cycle rather than
risk deleting them while still needed.
2017-05-23 10:11:27 +02:00
dash Work around deletion of still-needed init segments 2017-05-23 10:11:27 +02:00
doc "exec_record_started" event and "on_record_started" notification added fired when the system starts the recording process 2017-02-09 13:47:29 +00:00
hls EXT-X-ALLOW-CACHE using YES|NO instead of 1|0 2017-04-18 14:01:35 +02:00
test removed trailing space 2013-11-30 11:35:41 +04:00
.gitignore "exec_record_started" event and "on_record_started" notification added fired when the system starts the recording process 2017-02-09 13:47:29 +00:00
AUTHORS Version up 1.1.7.9 2015-09-23 16:28:02 +03:00
config Automatically generate CRC for MPEG-TS packets. 2017-03-27 12:06:18 +13:00
LICENSE updated year 2014-01-15 21:03:53 +04:00
ngx_rtmp.c Support Dynamic Module NGINX ≥ 1.9.11 2016-04-08 04:19:46 +03:00
ngx_rtmp.h Revert "Add event-based handle of reload/exit signal" 2017-05-19 00:59:11 +03:00
ngx_rtmp_access_module.c Update: 2015-11-30 13:02:57 +03:00
ngx_rtmp_amf.c Update: 2015-08-01 19:30:01 +03:00
ngx_rtmp_amf.h updated copyright line 2013-11-03 23:11:37 +04:00
ngx_rtmp_auto_push_module.c Get changes from @arut c0bf381d10 2016-11-26 00:43:32 +03:00
ngx_rtmp_bandwidth.c removed trailing spaces 2013-11-30 11:21:53 +04:00
ngx_rtmp_bandwidth.h added audio and video bw to stat 2013-12-23 20:24:40 +04:00
ngx_rtmp_bitop.c implemented avc sps parser & improved dash & stats 2013-12-21 00:47:00 +04:00
ngx_rtmp_bitop.h implemented avc sps parser & improved dash & stats 2013-12-21 00:47:00 +04:00
ngx_rtmp_cmd_module.c Revert "Add event-based handle of reload/exit signal" 2017-05-19 00:59:11 +03:00
ngx_rtmp_cmd_module.h Max request length and args length increase 2016-04-21 23:00:37 +03:00
ngx_rtmp_codec_module.c Merge pull request #138 from sergey-dryabzhinsky/fix-121-dash-availabilityEndTime 2016-07-06 18:02:14 +03:00
ngx_rtmp_codec_module.h Store audio and video bitrate in variables of type double 2016-02-26 20:44:48 +03:00
ngx_rtmp_control_module.c fixed errors in control output; now returning http 206 instead of empty recorded file path 2014-03-04 16:02:09 +04:00
ngx_rtmp_core_module.c Revert "Add event-based handle of reload/exit signal" 2017-05-19 00:59:11 +03:00
ngx_rtmp_eval.c removed trailing spaces 2013-11-30 11:21:53 +04:00
ngx_rtmp_eval.h merged exec pull feature 2013-11-26 14:13:07 +04:00
ngx_rtmp_exec_module.c exec_record_started is now called when the first frame is written in file 2017-02-10 17:31:22 +00:00
ngx_rtmp_flv_module.c implemented default buflen setting 2014-01-16 22:56:08 +04:00
ngx_rtmp_handler.c Revert "Add event-based handle of reload/exit signal" 2017-05-19 00:59:11 +03:00
ngx_rtmp_handshake.c OpenSSL-1.1 support 2017-04-13 15:12:47 -04:00
ngx_rtmp_init.c added queue init 2014-09-21 10:17:58 +04:00
ngx_rtmp_limit_module.c removed trailing spaces 2013-11-30 11:21:53 +04:00
ngx_rtmp_live_module.c Revert "Add event-based handle of reload/exit signal" 2017-05-19 00:59:11 +03:00
ngx_rtmp_live_module.h type error fix: accroding to the code details, ngx_rtmp_live_app_conf_t->buflen should be ngx_rtmp_live_app_conf_t->buffer. It's a flag rather than a msec config 2016-06-10 18:39:48 +08:00
ngx_rtmp_log_module.c Update: 2015-11-30 13:02:57 +03:00
ngx_rtmp_mp4_module.c fixed skipping first key frame in mp4 streamer 2014-04-24 07:06:11 +04:00
ngx_rtmp_netcall_module.c Update notfy parameters handle: 2016-04-22 01:00:46 +03:00
ngx_rtmp_netcall_module.h removed trailing spaces 2013-11-30 11:21:53 +04:00
ngx_rtmp_notify_module.c fixes for typo 2017-02-09 17:02:08 +00:00
ngx_rtmp_play_module.c Revert "Add event-based handle of reload/exit signal" 2017-05-19 00:59:11 +03:00
ngx_rtmp_play_module.h removed trailing spaces 2013-11-30 11:21:53 +04:00
ngx_rtmp_proxy_protocol.c fixed compilation with old nginx 2014-04-03 19:13:26 +04:00
ngx_rtmp_proxy_protocol.h added proxy protocol support 2014-03-31 08:52:20 +04:00
ngx_rtmp_receive.c removed trailing spaces 2013-11-30 11:21:53 +04:00
ngx_rtmp_record_module.c exec_record_started is now called when the first frame is written in file 2017-02-10 17:31:22 +00:00
ngx_rtmp_record_module.h exec_record_started is now called when the first frame is written in file 2017-02-10 17:31:22 +00:00
ngx_rtmp_relay_module.c Update: 2015-11-30 13:02:57 +03:00
ngx_rtmp_relay_module.h removed trailing spaces 2013-11-30 11:21:53 +04:00
ngx_rtmp_send.c Use nginx interval functions, Remove unused var 2016-01-05 21:54:13 +03:00
ngx_rtmp_shared.c Hack for circular chain by @heftig 2016-07-26 23:24:32 +03:00
ngx_rtmp_stat_module.c Connection info not always available. Show zero port if not. 2016-01-31 18:29:02 +03:00
ngx_rtmp_streams.h updated copyright line 2013-11-03 23:11:37 +04:00
ngx_rtmp_version.h Next dev version 2016-03-01 03:27:06 +03:00
README.md Updated README.md 2016-06-12 19:00:04 +03:00
stat.xsl Merge pull request #24 from sergey-dryabzhinsky/show-recording-status 2015-07-05 08:34:36 +03:00

NGINX-based Media Streaming Server

nginx-rtmp-module

Project blog

http://nginx-rtmp.blogspot.com

Documentation

Source: https://github.com/arut/nginx-rtmp-module/wiki

Google group

https://groups.google.com/group/nginx-rtmp

https://groups.google.com/group/nginx-rtmp-ru (Russian)

Donation page (Paypal etc)

http://arut.github.com/nginx-rtmp-module/

Features

  • 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

Build

cd to NGINX source directory & run this:

./configure --add-module=/path/to/nginx-rtmp-module
make
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

Contributing and Branch Policy

The "dev" branch is the one where all contributions will be merged before reaching "master". If you plan to propose a patch, please commit into the "dev" branch or its own feature branch. Direct commit to "master" are not permitted.

Windows limitations

Windows support is limited. These features are not supported

  • execs
  • static pulls
  • auto_push

RTMP URL format

rtmp://rtmp.example.com/app[/name]

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

name - interpreted by each application can be empty

Multi-worker live streaming

This NGINX-RTMP module does not support multi-worker live streaming. While this feature can be enabled through rtmp_auto_push on|off directive, it is ill advised because it is incompatible with NGINX versions starting 1.7.2 and up, there for it should not be used.

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 127.0.0.1;
            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
            push rtmp1.example.com;
            push rtmp2.example.com:1934;
        }

        application mypull {
            live on;

            # Pull all streams from remote machine
            # and play locally
            pull rtmp://rtmp3.example.com pageUrl=www.example.com/index.html;
        }

        application mystaticpull {
            live on;

            # Static pull is started at nginx start
            pull rtmp://rtmp4.example.com pageUrl=www.example.com/index.html 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/vnd.apple.mpegurl 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;
        }
    }
}