nginx +rtmp 流媒体服务器搭建 + SRS流媒体服务器搭建 +ffmpeg

部署nginx+rtmp 的流媒体服务器
##yum 安装nginx 版本号为nginx 1.12.2
yum install nginx -y

下载nginx-rtmp-module模块
git clone https://github.com/arut/nginx-rtmp-module.git
下载nginx-1.12.2.tar.gz
wget http://nginx.org/download/nginx-1.12.2.tar.gz 
tar -zxvf nginx-1.12.2.tar.gz 
cd nginx.1.12.2
编译
./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_auth_request_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module  --with-debug --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'  --add-module=/root/nginx-rtmp-module
编译过程报错处理

更换这个
--with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector \ 
--param=ssp-buffer-size=4 -m64 -mtune=generic' \

更换为
--with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
安装依赖库
yum -y install libxml2 libxml2-dev libxslt-devel 
yum -y install gd-devel 
yum -y install perl-devel perl-ExtUtils-Embed 
yum -y install GeoIP GeoIP-devel GeoIP-data
yum -y install pcre-devel
yum -y install openssl openssl-devel
安装
make && make install
重启nginx
systemctl nginx restart
查看安装模块rtmp是否添加成功
nginx -V


nginx配置文件添加
rtmp {
server {
   listen 1935; #监听的端口
   chunk_size 4000;
   application cctvf {#rtmp推流请求路径 (切记路径错了会推不上流)
   live on; #开启实时
   hls on; #开启hls
   hls_path /usr/local/src/nginx/html/cctvf; #rtmp推流请求路径,文件存放路
   hls_fragment 5s; #每个TS文件包含5秒的视频内容
 }
}
}

推流测试
obc软件推流

拉流测试
vlc播放器测试拉流


SRS流媒体搭建
使用centos6系统安装
在http://www.ossrs.net/srs.release/releases/ 下下载srs
安装
修改配置文件sys.conf
listen              1935;
max_connections     200;
srs_log_tank        file;
srs_log_file        ./objs/srs.log;
 
http_api {
    enabled         on;
    listen          1985;
}
 
http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html;
}
 
stats {
    network         0;
    disk            sda sdb xvda xvdb;
}
 
vhost __defaultVhost__ {
    # http-flv设置
    http_remux{
        enabled    on;
        mount      [vhost]/[app]/[stream].flv;
        hstrs      on;
    }
 
    # hls设置
    hls{
        enabled       on;
        hls_path      ./objs/nginx/html;
        hls_fragment  10;
        hls_window    60;
    }
}

./objs/srs -c conf/srs.conf

保存流媒体文件到本地
安装ffmpeg
cd /root
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
编译安装
./configure --prefix=host --enable-shared --disable-static --disable-doc 
make&&make install

可能遇到报错
  ./ffmpeg: error while loading shared libraries: libavdevice.so.57: cannot open shared object file: No such file or directory

配置
vim /etc/ld.so.conf.d/ffmpeg.conf
##添加lib路径
/root/ffmpeg/host/lib
然后执行  ldconfig 使配置生效
执行/root/ffmpeg/host/bin/ffmpeg -version查看是否安装成功

监控并保存视频流
nohup /root/ffmpeg/host/bin/ffmpeg -i rtmp://localhost:1935/cctvf/mystream -c copy dump-`date +%F`.flv & 

 

  • 使用python 保存接受rtmp流 并按时间段保存为flv格式视频
  • 主代码
  • #!/usr/bin/python
    import os
    import time
    
    class stream:
        '定义流监控'
        def __init__(self,streamCode,rtmpUrl):  #流码,rtmp url
            self.streamCode=streamCode
            self.rtmpUrl=rtmpUrl
            ##启动接受rtmp流
        def startStreamMonitor(self):
            os.popen('nohup /root/ffmpeg/host/bin/ffmpeg -i ' +self.rtmpUrl+'/'+self.streamCode + ' -c copy  ' +self.streamCode+'-`date +%F_%T`.flv >/dev/null 2>&1 &')
             ##获取pid
        def getProcessPid(self):
            try:
                p = os.popen("ps -ef|grep %s/%s|grep -v 'grep'|awk -F ' ' '{print $2}'" %(self.rtmpUrl,self.streamCode) )
                line = p.readlines()
                if line:
                    pid = line[0]
                    pid = pid.strip()
                    return pid
            except IndexError as e:
                print(str(e))
    
    
           #关闭流监控
        def stopStreamMonitor(self):
            pid=self.getProcessPid()
            os.popen('kill -9 %s' %pid)
    
    if __name__=='__main__':
        rtmpUrl='rtmp://localhost:1935/cctvf'
        flag=True
        flag_stop_stream=True
        stream_period=3600*24
        while flag:
            list_stream = []
            ##读取配置文件
            with open('stream.conf','r') as f:
                for item in f:
                    if item.startswith('list_streamCode'):
                        list_streamCode=eval(item.split(':')[1])
                    if item.startswith('stream_period'):
                        stream_period=int(eval(item.split(':')[1].strip()))
                 ###实例化所有的trmp对象,并启动接受,并保存为flv格式
            for i in list_streamCode:
              streamInstance='stream'+i
              streamInstance=stream(i,rtmpUrl)
              ##将对象存储在list中
              list_stream.append(streamInstance)
            if flag_stop_stream:
                for item in list_stream:
                    if item.getProcessPid():
                       item.stopStreamMonitor()
    
                flag_stop_stream=False
            for item in  list_stream:
                 item.startStreamMonitor()
            ##视频文件时长
            time.sleep(stream_period)
            ##关闭所有rtmp接受
            for item in list_stream:
                  item.stopStreamMonitor()

    配置文件

  • ###推流码
    list_streamCode: ['mystream','123456','mystream2','mystream3']
    ##单位秒
    stream_period: 60*60
    

     

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(linux,部署)