Linux centOS下搭建RTMP服务器的具体步骤

时间:2023-03-08 18:03:14
Linux centOS下搭建RTMP服务器的具体步骤

以下的所需的安装包,可直接在linux系统终端下载,也可从其他地方下载之后拷到对应目录下解压使用,遇到连接不到国外网站时可改变压缩包地址

1、安装依赖包:

#yum install glibc.i686
 #yum –y update
 #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   gcc-c++

2、安装git工具://新安装的软件都放在新建的softsource文件夹下
  
 #mkdir softsource
 #cd softsource
 #wget http://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz
 #tar xzvf git-latest.tar.gz 
 #cd git-2013-08-28
 #autoconf
 #./configure
 #make && make install
 # git --version
 git version 1.8.1.GIT
 #cd ..        目前直接回去rtmp目录, 没有在上一层安装FFmpeg
 
3、安装ffmpeg及其依赖包:
 ++++++++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 ..
 ++++++++x264+++++++++++
 #git clone git://git.videolan.org/x264
 #cd x264
 #./configure --enable-shared 
 #make
 #make install
 #cd ..
 ++++++++LAME+++++++++++    (#wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz)
 #wget http://kakola.googlecode.com/files/lame-3.98.4.tar.gz
 (安装lame-3.98.4.tar.gz, 以免在第三步的时候出现ERROR:libmp3lame >= 3.98.3 not found错误, 需要提前安装lame.)
 #tar xzvf lame-3.98.4.tar.gz
 #cd lame-3.98.4
 #./configure --enable-nasm
 #make
 #make install
 #cd ..
 ++++++++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 ..
 ++++++++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 ..
 ++++++++libvpx+++++++++++

#wget http://webm.googlecode.com/files/libvpx-v1.1.0.tar.bz2 
 #tar -vxjf libvpx-v1.1.0.tar.bz2
 #cd libvpx-v1.1.0
 #./configure  --enable-shared
 #make
 #make install
 #cd ..
 ++++++++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 ..
 ++++++++FAAC+++++++++++   #wget http://sourceforge.net/projects/faac/files/faac-src/faac-1.28/faac-1.28.tar.gz/download (http://172.16.1.100/faac-1.28.tar.gz)
 #tar zxvf faac-1.28.tar.gz
 #cd faac-1.28
 #cd common/mp4v2/
 #vi mpeg4ip.h
 126G—定位到126行后删除这一行,保持退出
 回到faac-1.28目录下:cd ..
 Cd ..
 #./configure
 #make
 #make install
 #cd ..
 ++++++++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 ..
 ++++++++ffmpeg+++++++++++

#git clone git://source.ffmpeg.org/ffmpeg
 #cd ffmpeg
 #./configure --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 ..
 ++++++++ zlib+++++++++++ 
 Wget http://www.zlib.net/zlib-1.2.8.tar.gz
 #tar xzvf zlib-1.2.8.tar.gz
 #cd zlib-1.2.8
 #./configure -prefix-/usr/local/zlib
 #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
 
 
 OpenSSL
 # wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
 # tar -zxvf openssl-1.0.1c.tar.gz
 # cd openssl-1.0.1c.tar.gz
 # ./config
 # make
 # make install
 
 会出现语法错误 POD document had syntax errors at /usr/bin/pod2man line 69. Make
    解决办法:rm /usr/bin/pod2man  删除此文件(可能是因为不兼容的问题)

4. 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. \
--with-pcre=../pcre-8.12 \
--with-zlib=../zlib-1.2. \
--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 \ 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-devel
 (ubuntu下的命令 centos下用yum -y install openssl openssl-devel)
 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
  
 解决方法:在nginx_mod_h264_streaming-2.2.7中修改
 那么将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
  
 解决方法:在nginx的安装目录
 # vim objs/Makefile (修改objs/Makefile文件, 去掉其中的"-Werror"), 然后就能够正常编译了.
 然后在make就能过了。
 
 
 安装过程中又下载了nginx_mod_h264_streaming-2.2.7   pcre-8.12  两个文件放入softsource文件夹中
 
 
******************************************
5、配置Nginx相关模块
 1、安装好了之后终端进入 nginx安装的目录 : /usr/local/nginx/html/
 然后新建目录:nginx-rtmp-module   (新建的命令为 mkdir 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/
 拷贝的时候 会报错因为 test文件是个文件夹所以 需要递归拷贝 在cp后边加上-r就可以了
 2.
 拷贝之后就需要修改 /usr/local/nginx/nginx.conf 
 nginx.conf  配置文件已经配好!(也可直接把rtmp那一块的配置直接拷贝到原来的nginx.conf文件中,这样就不需要太多的配置)

    #user  nobody;
worker_processes ; #error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info; pid logs/nginx.pid;
worker_rlimit_nofile ; events {
use epoll;
worker_connections ;
} #切换自动推送(多 worker 直播流)模式。默认为 off
rtmp_auto_push on; #当 worker 被干掉时设置自动推送连接超时时间。默认为 毫秒
rtmp_auto_push_reconnect 1s; #设置用于流推送的 UNIX 域套接字目录。默认为 /tmp
#rtmp_socket_dir /var/sock; rtmp {
server {
listen ; #点播配置
application vod {
play /opt/media/nginxrtmp/flv;
} #直播流配置
application live {
live on;
#为 rtmp 引擎设置最大连接数。默认为 off
max_connections ; # 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 ;
keepalive_timeout ; #gzip on; server {
listen ;
server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #location / {
# root html;
# index index.html index.htm;
#} #error_page /.html; # redirect server error pages to the static page /50x.html
#
error_page /50x.html;
location = /50x.html {
root html;
} # proxy the PHP scripts to Apache listening on 127.0.0.1:
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:;
# 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 -;
#} 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 -;
} 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 -;
} } # another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen ;
# listen somename:;
# server_name somename alias another.alias; # location / {
# root html;
# index index.html index.htm;
# }
#} # HTTPS server
#
#server {
# listen ;
# 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 ;
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 ;
}
}
location ~ \.flv$ {
flv;
#limit_conn one ;#限制客户端并发连接数
limit_rate 200k;#限制每客户端最大带宽
}
location ~ \.mp4$ {
flv;
#limit_conn one ;
limit_rate 200k;
}
#access_log logs/nginxflv_access.log main;
} server
{
listen ;
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 ;
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;
}
} }

如果出现端口 wait_CLOSE
 就在 /etc/sysctl.conf中添加
 net.ipv4.tcp_tw_reuse=1
 net.ipv4.tcp_tw_recycle=1
 然后让配置生效
 /sbin/sysctl -p
 (以上的命令都是在根目录执行的)
 
6、根据nginx的配置文件的中的配置设置端口号  (此步骤 暂不清楚   不过可以直接将防火墙全部关闭,service firewalld stop)
 #vi /etc/sysconfig/iptables   (此文件可以自己创建然后在网上找相关的代码拷进去)
 开放8081端口  (进入nginx的nginx.conf中设置端口为8081)
 #/sbin/service iptables restart 
 重启防火墙,设置生效
 修改防火墙配置文件,所在目录/etc/sysconfig/iptables,在里面增加需要开通的端口号,如下:
 1
 2 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT 
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8088 -j ACCEPT
 #增加的代码必须放在以下代码之上,否则不会起作用.
 1
 2 -A INPUT -j REJECT --reject-with icmp-host-prohibited 
 -A FORWARD -j REJECT --reject-with icmp-host-prohibite
 
7、 启动nginx后测试

(如果没有nginx文件夹中没有sbin文件那么可以直接进入nginx文件夹
 使用 ./nginx 启动nginx 
      ./nginx -t 测试是否配置成功
   ./nginx -s reload 重启nginx)

启动命令:
/usr/local/nginx/nginx  -c /usr/local/nginx/nginx.conf  (能保证rtmp正常运行)

启动命令其实就用
 进入#usr/local/nginx/sbin/下   ./nginx 就可以
 
 启动nginx的帮助文档:
 #/usr/local/nginx/sbin/nginx -h
 #/usr/local/nginx/sbin/nginx –s reload
 查看nginx的配置是否正确:
 #usr/local/nginx/sbin/nginx –t/
 如果配置是正确的会显示如下内容:
 Nginx.conf syntax is ok.
 Nginx.conf test is successful.
 
 配置成功后使用ffmpeg进行推流
 
 (转发凤凰卫视的直播地址)ffmpeg -re -i rtmp:/live.hkstv.hk.lxdns.com/live/hks -c:a aac -ac 1 -strict -2 -b:a 64k -c:v libx264 -f flv rtmp://192.168.1.75/live/stream

(标准地址格式)ffmpeg -re -i /root/softsource/960x720_30fps.mp4 -f flv rtmp://192.168.1.59/live/stream