nginx搭建rtmp協議流媒體服務器總結

最近在 ubuntu12.04+wdlinux(centos)上搭建了一個rtmp服務器,感受還挺麻煩的,因此記錄下。php

大部分都是參考網絡上的資料。html

前提:node

在linux下某個目錄中新建一個nginx目錄。linux

而後進入該目錄去下載搭建環境所須要的一些資源包。nginx

此處在 /root/  目錄下新建一個nginx目錄即:git

/root/softsource/github

注意:依賴包和工具包須要下載,請在良好的網絡環境下安裝,不然在網速很差的狀況下容易下漏掉,形成後面安裝失敗web

====================================ubuntu

一、安裝依賴包:
#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 xzvf git-latest.tar 
# cd git-2014-06-27
# autoconf
# ./configure
# make && make install
# git --version
git version 2.0.0.GIT
# cd ..

2). zlib
# wget http://zlib.net/zlib-1.2.8.tar.gz
# tar -zxvf zlib-1.2.8.tar.gz cd zlib-1.2.8
# ./configure
# make
# make install
# cd ..

3). pcre
# wget http://exim.mirror.fr/pcre/pcre-8.32.tar.gz
# tar zxvf pcre-8.12.tar.gz
# cd pcre-8.12
# ./configure
# make && make install
# cd ..

4). yadmi
yadmi的做用是爲flv文件添加關鍵幀,才能實現拖動播放
# wget http://sourceforge.net/projects/yamdi/files/yamdi/1.4/yamdi-1.4.tar.gz/download  
# tar xzvf download
# cd yamdi-1.4
# make && make install
# cd ..
 
測試方法:
# yamdi -i input.flv -o out.flv
給input.flv文件 添加關鍵幀,輸出爲out.flv文件

5). OpenSSL
# wget http://www.openssl.org/source/openssl-1.0.1i.tar.gz
# tar -zxvf 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 xzvf yasm-1.2.0.tar.gz
# cd yasm-1.2.0
# ./configure
# make
# make install
# cd ..

2). x264
# git clone git://git.videolan.org/x264
# cd x264
# ./configure --enable-shared 
# make
# make install
# cd ..
若是這個下載不到,請搜索下載"last_x264.tar"vim

注意:可能出現安裝錯誤  修改  x264目錄下的version.sh

    找到  version=""  改成  version="2245"我這裏是這個版本號 具體根據你下載解壓後的文件最後那幾個數字就是版本號

有必要介紹下linux幾種壓縮文件的解壓方法:

    .tar.gz   tar -xzvf 該類型文件(下面就以file代替) -xzvf 能夠不加前面的-

 .tar.bz2   tar -xjvf file 也能夠不加 -

   .tar tar  -xf file

   .tar.xz tar -xjvf

  .zip unzip

以上是本人經常使用的幾個,瞭解更多的請找度娘
3). LAME
# wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
# tar xzvf lame-3.99.5.tar.gz
# cd lame-3.99.5
#./configure --enable-nasm
# make
# make install
# cd ..

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

5). libvorbis
# wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
# tar xzvf libvorbis-1.3.3.tar.gz
# cd libvorbis-1.3.3
# ./configure
# make
# make install
# cd ..
注意這裏 :應該是先安裝libogg後在安裝libvorbis 若是中間發生帶有 "must ogg installled"的語句,此時不要慌張

      由於你安裝到這裏來了,說明你前面的libogg是安裝成功了,可是爲何說找不到ogg呢,我這裏只說解決知道,緣由我也不知道

              解決:在 /etc/ld.so.conf/目錄下建立名爲 local-libraries.conf的文件

          vi /etc/ld.so.conf/local-libraries.conf

                 文件內容:/usr/local/lib

          wq!---保存退出

          在執行 ldconfig -v

    這裏建議安裝下vim

        
6). libvpx
# git clone http://git.chromium.org/webm/libvpx.git
# cd libvpx
# ./configure  --enable-shared
# make
# make install
# cd ..

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

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

注:編譯時可能遇到一下錯誤:

mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’

解決方法:

從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 zxvf xvidcore-1.3.2.tar.gz
# cd xvidcore/build/generic
# ./configure
# make
# make install
# cd ..

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
# cd ..

修改/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
特別強調:在centos下可能出現 「waring using libx264 without pkgconfig」警告,出現後繼續安裝 安裝結束也是能夠的

      在ubuntu下如果安裝時提示缺乏什麼包的話  使用  sudo apt-get 工具包名 安裝對應缺乏的包就能解決問題

2、安裝Nginx相關模塊
1. 模塊安裝
# wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
# tar zxvf 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 zxvf nginx-1.6.0.tar.gz
# cd nginx-1.6.0

4.編譯安裝nginx

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

而後使用gedit 打開進行編輯:

 
#!/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就能過了。

 

3、配置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; } } }
 

4、啓動Nginx相關模塊

1.

配置好以後就能夠開啓nginx服務器了。

能夠在終端執行:

#service nginx start

注:可能會出現一下錯誤:

nginx: unrecognized service

解決方法:

下載nginx的啓動腳本:
# wget -O init-deb.sh http://library.linode.com/assets/660-init-deb.sh
將腳本添加到init.d目錄和生成可執行:
# sudo mv init-deb.sh /etc/init.d/nginx
# sudo chmod +x /etc/init.d/nginx
加的nginx到系統啓動:
# sudo /usr/sbin/update-rc.d -f nginx defaults

如今咱們可使用nginx的控制:

sudo service nginx stop
sudo service nginx start
sudo service nginx restart
sudo service nginx reload

2.
在開啓以前記得要打開 1935端口。

CentOS 6.4開放端口方法

一、LINUX下經過命令開啓容許對外訪問的網絡端口: 
 /sbin/iptables -I INPUT -p tcp --dport 1935 -j ACCEPT


/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart

二、查看端口是否開放 
 /etc/init.d/iptables status

ubuntu下:sudo iptables -I INPUT -p tcp --dport 1935 -j ACCEPT

 



3.
可是開啓的時候命令行要這樣去啓動:

#  /usr/local/ngnix/nginx  –c  /usr/local/nginx/nginx.conf

這樣nginx 的rtmp協議流媒體服務器才能用。

 

4.下面使用ffmpeg 往rtmp服務器推送一個視頻:

ffmpeg -re -i /home/song/Desktop/apk/test.flv -f flv rtmp://172.16.80.18/live/steam

這樣在 vlc或者 flash player 上就能夠打開 rtmp地址:

rtmp://192.168.1.11/live/steam

進行觀看了。

還要說明的是 若是你不是在服務器上推流  而是在其它的終端推流 好比 一臺pc使用obs軟件作直播 而後推送到你的流媒體服務器上 而後服務器作分發直播視頻 那麼你也能夠暫時不安裝ffmpeg

      可是ffmpeg安裝後 能夠起到 音視頻轉碼  中轉(pc推流過來 再將此流經過ffmpeg推流到其它地方)這些也是頗有用的

注:若是使用的是虛擬機安裝的話,記得網絡適配器 要選擇 「橋接模式」 使用虛擬機裏的ip 地址和 主機地址在一個網端,這樣外部好比 手機 或者局域網內的其餘機器才能訪問

該虛擬機上搭建的nginx服務器了。

 

補充說明 wdlinux更新 nginx

一、①【前提須要安裝依賴包和工具包,因此仍是把文章開始提到的包都安裝上,否則這裏會出錯的】wget  http://www.jicker.cn/down/2015/2/nginx_up.sh  sh nginx_up.sh nginx版本號(例如 1.10.0)-----好像這個也要下載對應版本的包才能成功 我是這樣作的

或者② 先下載須要的添加的模塊

git clone git: //github .com /yaoweibin/ngx_http_substitutions_filter_module .git

 再下載對應的nginx版本 

wget -c http: //www .nginx.org /download/nginx-1 .10.0. tar .gz
tar zxvf nginx-1.10.0. tar .gz

 

二、看一下,咱們的nginx的已經有的一些參數

[root@cloud sbin]# 
/www/wdlinux/nginx-1 .0.15 /sbin/nginx -V

nginx version: nginx/-1.0.15

.....

TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/www/wdlinux/nginx -1 .0.15 --with-http_stub_status_module --with-http_ssl_module
 cd 下載好了後更新好了的  /www/wdlinux/nginx-1.10.0目錄下
因而只要將咱們須要的模塊添加到後面便可
cd nginx-1.10.0
. /configure --user=www --group=www --prefix= /www/wdlinux/nginx-1 .10.0 --with-http_stub_status_module --with-http_ssl_module --add-module= /root/ngx_http_substitutions_filter_module-【這裏就能夠添加rtmp模塊這些; 和上面同樣
make

 #####此處不須要install

service nginxd stop
mv /www/wdlinux/nginx-1 .10.0 /sbin/nginx  /www/wdlinux/nginx-1 .10.0 /sbin/nginx .old
cp objs /nginx /www/wdlinux/nginx-1 .10.0 /sbin/nginx----【要在目錄下看看有沒有objs這個目錄 沒有的話 恭喜你失敗了】
/www/wdlinux/nginx-1 .10.0 /sbin/nginx -t
service nginxd start

 ####能夠看見參數中帶有新添加的模塊

/www/wdlinux/nginx-1 .10.0 /sbin/nginx -V
相關文章
相關標籤/搜索