nginx rtmp

======配置目的======

讓Nginx支持flv和mp4格式文件,支持RTMP協議的直播和點播;
同時打開RTMP的HLS功能

資料:
HTTP Live Streaming(縮寫是 HLS)是一個由蘋果公司提出的基於HTTP的流媒體網絡傳輸協議。
HLS只請求基本的HTTP報文,與實時傳輸協議(RTP)不同,HLS可以穿過任何允許HTTP數據通過的防火牆或者代理服務器。
它也很容易使用內容分發網絡來傳輸媒體流。

======前提條件======

Nginx: http://nginx.org
模塊:nginx_mod_h264_streaming(支持h264編碼的視頻)
模塊:http_flv_module 支持flv
模塊:http_mp4_module 支持mp4
下載地址:
http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
https://github.com/arut/nginx-rtmp-module



======安裝依賴包======

yum -y install gcc glibc glibc-devel make nasm pkgconfig lib-devel openssl-devel expat-devel gettext-devel libtool mhash.x86_64 perl-Digest-SHA1.x86_64



======安裝相關工具包======

1.安裝git
mkdir soft-source
cd soft-source
wget http://codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.xz
xz -d git-latest.tar.xz
tar xf git-latest.tar 
cd git-2016-03-29
autoconf
./configure
make && make install
git --version


2.zlib安裝
wget http://zlib.net/zlib-1.2.8.tar.gz
tar xf zlib-1.2.8.tar.gz 
cd zlib-1.2.8
./configure
make && make install


3.pcre安裝
wget http://exim.mirror.fr/pcre/pcre-8.12.tar.gz
tar xf pcre-8.12.tar.gz
cd pcre-8.12
./configure
make && make install


4.yadmi安裝
yadmi的作用是爲flv文件添加關鍵幀,才能實現拖動播放
wget http://sourceforge.net/projects/yamdi/files/yamdi/1.4/yamdi-1.4.tar.gz/download  
tar xf yamdi-1.4.tar.gz
cd yamdi-1.4
make && make install


5.OpenSSL安裝
wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
tar xf openssl-1.0.1c.tar.gz
./config
make && make install







======安裝ffmpeg及其依賴包======

1). Yasm
wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
tar xf yasm-1.2.0.tar.gz
cd yasm-1.2.0
./configure
make
make install


2). x264
git clone git://git.videolan.org/x264
cd x264
./configure --enable-shared 
make
make install

3). LAME
wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
tar xf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure --enable-nasm
make
make install


4). libogg
wget http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz
tar xf libogg-1.3.0.tar.gz
cd libogg-1.3.0
./configure
make
make install


5). libvorbis
wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
tar xf libvorbis-1.3.3.tar.gz
cd libvorbis-1.3.3
./configure
make
make install


6). libvpx
git clone https://github.com/Distrotech/libvpx.git
cd libvpx
./configure  --enable-shared
make
make install


7). FAAD2
wget http://downloads.sourceforge.net/project/faac/faad2-src/faad2-2.7/faad2-2.7.tar.gz
tar xf faad2-2.7.tar.gz
cd faad2-2.7
./configure
make
make install


8). FAAC
wget http://downloads.sourceforge.net/project/faac/faac-src/faac-1.28/faac-1.28.tar.gz
tar xf faac-1.28.tar.gz
cd faac-1.28
./configure
make
make install


在make之前修改
 vim +123 ./common/mp4v2/mpeg4ip.h
從123行開始修改此文件mpeg4ip.h,到129行結束。

修改前:

#ifdef __cplusplus

extern "C" {

#endif

char *strcasestr(const char *haystack, const char *needle);

#ifdef __cplusplus

}

#endif

 

修改後:

#ifdef __cplusplus

extern "C++" {

#endif

const char *strcasestr(const char *haystack, const char *needle);

#ifdef __cplusplus

}

#endif




 9). Xvid
wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
tar xf xvidcore-1.3.2.tar.gz
cd xvidcore/build/generic
./configure
make
make install

10). ffmpeg
git clone git://source.ffmpeg.org/ffmpeg
cd ffmpeg
./configure  --prefix=/opt/ffmpeg/ --enable-version3 \
--enable-libvpx --enable-libfaac --enable-libmp3lame \
--enable-libvorbis --enable-libx264 --enable-libxvid \
--enable-shared --enable-gpl --enable-postproc --enable-nonfree  \
--enable-avfilter --enable-pthreads
make && make install



修改/etc/ld.so.conf如下:
include ld.so.conf.d/*.conf
/lib
/lib64
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
/opt/ffmpeg/lib
# ldconfig




======安裝Nginx相關模塊======
<code>
1. 模塊安裝
wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
tar xf nginx_mod_h264_streaming-2.2.7.tar.gz
git clone git://github.com/arut/nginx-rtmp-module.git



2. 創建用戶和組
groupadd www
useradd -g www www

3. nginx安裝
wget http://nginx.org/download/nginx-1.6.0.tar.gz
tar xf nginx-1.6.0.tar.gz
cd nginx-1.6.0

4.編譯安裝nginx

在nginx-1.6.0目錄下新建文件:nginx_configure.sh
vim nginx_configure.sh

#!/bin/sh

echo "configure start ..."
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--add-module=../nginx_mod_h264_streaming-2.2.7 \
--with-pcre=../pcre-8.12 \
--with-zlib=../zlib-1.2.8 \
--with-http_dav_module \
--with-http_flv_module \
--with-http_stub_status_module \
--without-http_scgi_module \
--without-http_uwsgi_module \
--without-http_gzip_module \
--without-http_ssi_module \
--without-http_proxy_module \
--without-http_memcached_module \
--without-http_empty_gif_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
--with-http_ssl_module \
--with-openssl=../openssl-1.0.1c \
--add-module=../nginx-rtmp-module \
--with-cc-opt=-I/opt/ffmpeg/include \
--with-ld-opt='-L/opt/ffmpeg/lib -Wl,-rpath=/opt/ffmpeg/lib'
echo "configure end!"




【保存並退出】
chmod +x nginx_configure.sh
./nginx_configure.sh
make && make install


備註:

在執行make的時候可能出現錯誤1:

adding module in ../nginx_mod_h264_streaming-2.2.7

 + ngx_http_h264_streaming_module was configured

adding module in ../nginx-rtmp-module

 + ngx_rtmp_module was configured

checking for OpenSSL library ... not found

 

./configure: error: SSL modules require the OpenSSL library.

You can either do not enable the modules, or install the OpenSSL library

into the system, or build the OpenSSL library statically from the source

with nginx by using --with-openssl=<path> option.

 

configure end!

root@ubuntu:/home/song/nginx-t/nginx-1.6.0# make

make: *** No rule to make target `build', needed by `default'.  Stop.

 

解決方法:

a)可以安裝ssl

apt-get install openssl

apt-get install libssl-dev

b)也可以添加

--with-openssl=<path>

在執行make的時候可能出現錯誤2:

/root/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c: In function ‘ngx_streaming_handler’:

 

/root/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c:158: error: ‘ngx_http_request_t’ has no member named ‘zero_in_uri’

 

make[1]: *** [objs/addon/src/ngx_http_h264_streaming_module.o] Error 1

 

make[1]: Leaving directory `/root/nginx-0.8.54'

 

make: *** [build] Error 2

 

解決方法:

那麼將src/ngx_http_streaming_module.c文件中以下代碼刪除或者是註釋掉就可以了:

/* TODO: Win32 */

if (r->zero_in_uri)

{

return NGX_DECLINED;

}

 

在執行make的時候可能出現錯誤3:

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c: 在函數‘esds_read’中:

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:377:16: 錯誤: 變量‘stream_priority’被設定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:376:12: 錯誤: 變量‘stream_id’被設定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c: 在函數‘stsd_parse_vide’中:

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:529:22: 錯誤: 變量‘level_indication’被設定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:528:22: 錯誤: 變量‘profile_compatibility’被設定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:527:22: 錯誤: 變量‘profile_indication’被設定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:526:22: 錯誤: 變量‘configuration_version’被設定但未被使用 [-Werror=unused-but-set-variable]

cc1: all warnings being treated as errors

make[1]: *** [objs/addon/src/mp4_reader.o] 錯誤 1

 

解決方法:

# vim objs/Makefile (修改objs/Makefile文件, 去掉其中的"-Werror"), 然後就能夠正常編譯了.

然後在make就能過了。



======配置Nginx相關模塊======

1.

安裝好了之後終端進入 nginx安裝的目錄 : /usr/local/nginx/html/

然後新建目錄:nginx-rtmp-module

然後拷貝 之前用於存放下載 nginx 所需資源包的目錄 :/root/nginx/nginx-rtmp-module/

拷貝 目錄 test 到/usr/local/nginx/html/ 目錄下:

cp /root/nginx-rtmp-module/test /usr/local/nginx/html/nginx-rtmp-module/

cp /root/nginx-rtmp-module/stat.xsl /usr/local/nginx/html/nginx-rtmp-module/


2.

拷貝之後就需要修改 /usr/local/nginx/nginx.conf 文件:

下面是配置好的nginx.conf 文件:
#user  nobody;
worker_processes  4;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;
worker_rlimit_nofile 51200;


events {
    use epoll;
    worker_connections  51200;
}

#切換自動推送(多 worker 直播流)模式。默認爲 off
rtmp_auto_push on;

#當 worker 被幹掉時設置自動推送連接超時時間。默認爲 100 毫秒
rtmp_auto_push_reconnect 1s;

#設置用於流推送的 UNIX 域套接字目錄。默認爲 /tmp
#rtmp_socket_dir /var/sock;

rtmp {
    server {
            listen 1935;

        #點播配置
                application vod {
                    play /opt/media/nginxrtmp/flv;
                }
        
        #直播流配置
            application live {
                    live on;
            #爲 rtmp 引擎設置最大連接數。默認爲 off
            max_connections 1024;

                    # default recorder
                    record all;
                    record_path /var/rec;
 
                    recorder audio {
                         record audio;
                         record_suffix -%d-%b-%y-%T.flv;
                    } 

                    recorder chunked {
                        record all;
                         record_interval 15s;
                         record_path /var/rec/chunked;
                    }

            #on_publish http://localhost:8080/publish;  
            #on_play http://localhost:8080/play;  
            #on_record_done http://localhost:8080/record_done;
            
            #rtmp日誌設置
             #access_log logs/rtmp_access.log new;
             #access_log logs/rtmp_access.log;
             #access_log off;

             }
        
        #HLS協議支持
        #application hls {  
            #live on;  
            #hls on;  
            #hls_path /tmp/app;  
            #hls_fragment 5s;  
        #} 

            application hls{
        
                    live on;
                    hls on;
                    hls_path /usr/local/nginx/html/app;
                    hls_fragment 1s;
            }
 

        }
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}

    location /rtmp-publisher {  
        root /root/nginx/nginx-rtmp-module/test;  
    }  

    #location /hls {  
        #server hls fragments  
        #types{  
            #application/vnd.apple.mpegurl m3u8;  
            #video/mp2t ts;  
        #}
  
        #alias /usr/local/nginx/html;  
        #expires -1;  
    #}

    location /hls {
         #server hls fragments
              types{
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
              }

             #alias /usr/local/nginx/html/app;
         alias /usr/local/nginx/html;
             expires -2;
         }  

    location / {  
        #root /root/nginx/nginx-rtmp-module/test/rtmp-publisher;  
        types{  
          application/vnd.apple.mpegurl m3u8;  
          video/mp2t ts;  
        }
  
        root /usr/local/nginx/html/rtmp-publisher;  
        expires -1;  
    }  

    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    #支持flv
    server
        {
            listen       8081;
            server_name localhost;
            #root /opt/pub/media/nginx; #http協議時候,flv視頻位置
        #root /root/nginx/nginx-rtmp-module/test/www;
            root /usr/local/nginx/html/www;

            location ~ .*.(flv|swf|mp4|wma|wmv)$ {
                    valid_referers none blocked *.xxxx.com http://localhost;
                    if ($invalid_referer) {
                    return 403;
                    }
            }
            location ~ \.flv$ {
                    flv;
                    #limit_conn one 20;#限制客戶端併發連接數
                    limit_rate 200k;#限制每客戶端最大帶寬
            }
            location ~ \.mp4$ {
                    flv;
                    #limit_conn one 20;
                    limit_rate 200k;
            }
            #access_log  logs/nginxflv_access.log  main;
        }

    server
        {
            listen       8082;
            server_name localhost;
            index index.html;
            location / {
                #root /opt/pub/media/nginx-rtmp;
        root /root/nginx/nginx-rtmp-module/test/rtmp-publisher;
            }
            #access_log  logs/nginxrtmpflv_access.log  main;
        }

    server {
        listen      8080;
    server_name localhost;
    index player.html;

        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet /root/nginx/nginx-rtmp-module/stat.xsl;
        }
        location /stat.xsl {
            root /root/nginx/nginx-rtmp-module;
        }

        location /rtmp-publisher {  
            root /usr/local/nginx/html/test/rtmp-publisher;  
        }  

        location / {
            root /root/nginx/nginx-rtmp-module/test/rtmp-publisher;
        }
    }

}



推流使用OBS進行推流
rtmp://192.168.15.3/live/
流祕鑰:stream

客戶端使用VLC進行觀看
rtmp://192.168.15.3/live/stream


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章