mirror of
https://github.com/zotanmew/nginx-rtmp-module.git
synced 2024-06-02 06:39:32 +02:00
converted README to markdown format
This commit is contained in:
parent
2bd3d17fbb
commit
05927f717b
257
README
257
README
|
@ -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=<path-to-nginx-rtmp-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/<app>[/<name>]
|
|
||||||
|
|
||||||
<app> - should match one of application {}
|
|
||||||
blocks in config
|
|
||||||
<name> - 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
257
README.md
Normal file
257
README.md
Normal file
|
@ -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=<path-to-nginx-rtmp-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/<app>[/<name>]
|
||||||
|
|
||||||
|
<app> - should match one of application {}
|
||||||
|
blocks in config
|
||||||
|
<name> - 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue