diff --git a/README b/README deleted file mode 100644 index 32755f2..0000000 --- a/README +++ /dev/null @@ -1,257 +0,0 @@ -== nginx-rtmp-module == - -NGINX-based RTMP server - -Project page: - - http://arut.github.com/nginx-rtmp-module - -Wiki manual: - - https://github.com/arut/nginx-rtmp-module/wiki - -Features: - -* Live streaming of video/audio - -* Video on demand (FLV) - -* Stream relay support for distributed - streaming: push & pull models - -* Recording published streams in FLV file - -* H264/AAC support - -* Online transcoding with FFmpeg - -* HLS (HTTP Live Streaming) support; - experimental; requires recent libavformat - (>= 53.31.100) from ffmpeg (ffmpeg.org) - -* HTTP callbacks on publish/play/record - -* 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 - - -Build: - -cd to NGINX source directory & run this: - -./configure --add-module= -make -make install - - -Known issue: - - The module does not share data between workers. - Because of this live streaming is only available - in one-worker mode so far. Video-on-demand has no - such limitations. - - You can try auto-push branch with multi-worker - support if you really need that. - - -RTMP URL format: - -rtmp://rtmp.example.com/[/] - - - should match one of application {} - blocks in config - - interpreted by each application - can be empty - - -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 /usr/bin/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 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; - } - - # video on demand - application vod { - play /var/flvs; - } - - # 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 (experimental) - - # HLS requires libavformat & should be configured as a separate - # NGINX module in addition to nginx-rtmp-module: - # ./configure ... --add-module=/path/to/nginx-rtmp-module/hls ... - - # For HLS to work please create a directory in tmpfs (/tmp/app here) - # for the fragments. The directory contents is served via HTTP (see - # http{} section in config) - # - # Incoming stream must be in H264/AAC/MP3. 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 { - hls on; - hls_path /tmp/app; - hls_fragment 5s; - } - - } -} - -# 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 - alias /tmp/app; - } - - } -} - diff --git a/README.md b/README.md new file mode 100644 index 0000000..f920491 --- /dev/null +++ b/README.md @@ -0,0 +1,257 @@ +# nginx-rtmp-module + +## NGINX-based RTMP server + +### Project page: + + http://arut.github.com/nginx-rtmp-module + +### Wiki manual: + + https://github.com/arut/nginx-rtmp-module/wiki + +### Features: + +* Live streaming of video/audio + +* Video on demand (FLV) + +* Stream relay support for distributed + streaming: push & pull models + +* Recording published streams in FLV file + +* H264/AAC support + +* Online transcoding with FFmpeg + +* HLS (HTTP Live Streaming) support; + experimental; requires recent libavformat + (>= 53.31.100) from ffmpeg (ffmpeg.org) + +* HTTP callbacks on publish/play/record + +* 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 + + +### Build: + +cd to NGINX source directory & run this: + + ./configure --add-module= + make + make install + + +### Known issue: + + The module does not share data between workers. + Because of this live streaming is only available + in one-worker mode so far. Video-on-demand has no + such limitations. + + You can try auto-push branch with multi-worker + support if you really need that. + + +### RTMP URL format: + + rtmp://rtmp.example.com/[/] + + - should match one of application {} + blocks in config + - interpreted by each application + can be empty + + +### 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 /usr/bin/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 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; + } + + # video on demand + application vod { + play /var/flvs; + } + + # 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 (experimental) + + # HLS requires libavformat & should be configured as a separate + # NGINX module in addition to nginx-rtmp-module: + # ./configure ... --add-module=/path/to/nginx-rtmp-module/hls ... + + # For HLS to work please create a directory in tmpfs (/tmp/app here) + # for the fragments. The directory contents is served via HTTP (see + # http{} section in config) + # + # Incoming stream must be in H264/AAC/MP3. 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 { + hls on; + hls_path /tmp/app; + hls_fragment 5s; + } + + } + } + +# 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 + alias /tmp/app; + } + + } + } +