zoukankan      html  css  js  c++  java
  • 基于Nginx+nginx-rtmp-module+ffmpeg搭建rtmp、hls流媒体服务器

    上篇文章是基于Red5与ffmpeg实现rtmp处理NVR或摄像头的监控视频处理方案,有兴趣的朋友可以查看。

    Nginx及nginx-rtmp-module安装

    新建目录
    mkdir /usr/local/mginx
    下载
    cd /usr/local/nginx
    wget http://nginx.org/download/nginx-1.12.2.tar.gz
    wget https://codeload.github.com/arut/nginx-rtmp-module/zip/master
    解压
    tar -zxvf nginx-1.12.2.tar.gz
    unzip nginx-rtmp-module-master.zip 
    安装

    nginx的一些模块依赖一些lib库,在安装nginx之前,须先安装这些lib库,

    依赖库主要有g++、gcc、openssl-devel、pcre-devel和zlib-devel 视情况执行如下命令安装

    yum install gcc-c++ 
    yum install pcre pcre-devel  
    yum install zlib zlib-devel 
    yum install openssl openssl--devel 
    nginx-rtmp-module模块安装
    cd /usr/local/nginx/nginx-1.12.2
    #完成rtmp模块安装
    ./configure --add-module=/usr/local/nginx/nginx-rtmp-module-master
    make
    make install

    至此nginx及相关模块安装完毕

    配置及启动服务支持rtmp

    修改配置
    cd /usr/local/nginx/conf
    vim nginx.conf
    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    rtmp {
        server {
    	listen 1935;
    	chunk_size 4096;
    
    	application vod {
    		play /usr/local/nginx/html/hls;
         	}
    
        	application live {
                    live on; 
            }
        }
    }
    
    
    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;
            }
    	
    	#fastdfs 将 /group1/M00 映射到 /usr/local/fastdfs/file/data
    	location /group1/M00 {
    	    alias /usr/local/fastdfs/file/data;
    	}
    
    
            # 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;
            #}
        }
    
    
        # 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 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }
    服务管理
    cd /usr/local/nginx/sbin
    nginx #启动服务
    nginx -s stop #管理服务
    直播

    http服务测试 http://127.0.0.1/


    利用ffmpeg进行推流直播

    ffmpeg -re -i "E:ffmpeg-20180227-fa0c9d6-win64-staticin1234.mp4" -acodec copy -vcodec copy -f flv -an  rtmp://192.168.174.200:1935/live/a 

    利用vlc测试,地址:rtmp://192.168.174.200:1935/live/a


    点播

    将本地mp4文件复制到/usr/local/nginx/html/hls

    利用vlc测试:rtmp://192.168.174.200:1935/vod/1234.mp4

    配置支持hls

    工作流程
    点播:准备好视频文件MP4,使用ffmpeg将其转成TS格式文件,然后继续使用ffmpeg将其切片并生成播放列表M3U8文件,将所得TS分片与M3U8文件放到nginx服务器目录下,开启http服务器后,同一局域网内用手机输入网络地址可查看点播视频。 
    直播:使用VLC软件将视频以rtsp流的形式发出,使用ffmpeg接收这个rtsp流并实时切割到http服务器下,开启服务器后,同一局域网内用手机输入网络地址可查看直播视频。
    修改配置文件
    cd /usr/local/nginx/conf
    vim mime.types
    
    #在 application/zip zip; 这一行后面增加2行: 
    application/x-mpegURL m3u8; 
    application/vnd.apple.mpegurl m3u8;
    
    vim video/x-msvideo
    #avi;行后,增加1行:
    video/MP2T ts;
    点播

    使用ffmpeg将mp4格式文件转成TS格式文件

    ffmpeg -y -i 1234.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb test.ts

    使用ffmpeg将TS文件切成ts分片并产生m3u8文件

    ffmpeg -i test.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 2 test%03d.ts

    将所得的ts分片和m3u8文件放到nginxhtml目录下

    vlc输入[ http://192.168.174.200:80/playlist.m3u8 ]即可看到点播视频 

    注:192.168.174.200是本机的局域网ip,也即http服务器的ip

    直播
    将视频以rtsp流的形式从vlc上发出来(具体方法请自查) 

    使用ffmpeg接收rtsp流并自动实时切片到http服务器下

    ffmpeg -i rtsp://admin:admin@172.19.12.192/cam/realmonitor?channel=1&subtype=1 -c copy -vcodec h264 -f hls -hls_time 2.0 -hls_list_size 5 -hls_wrap 5 /usr/local/nginx/html/test.m3u8
    

    vlc输入[ http://172.19.12.240/test.m3u8 ]即可看到直播视频

    录制

    通过ffmpeg向服务器推流,在服务器进行视频录制

    ffmpeg -re -i "E:ffmpeg-20180227-fa0c9d6-win64-staticin1234.mp4" -acodec copy -vcodec copy -f flv -an  rtmp://192.168.174.200:1935/live/a
    http://192.168.174.200/hls/a/index.m3u8

    修改nginx.conf配置

    rtmp {
        server {
    	listen 1935;
    	chunk_size 4096;
    
    	application vod {
    		play /usr/local/nginx/html/hls;
         	}
    
        	application live {
                    live on;
    	        hls on; #这个参数把直播服务器改造成实时回放服务器。
                    wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。
                    hls_path /usr/local/nginx/html/hls; #切片视频文件存放位置。
                    hls_fragment 10s;     #每个视频切片的时长。
                    hls_playlist_length 60s;  #总共可以回看的事件,这里设置的是1分钟。
                    hls_continuous on; #连续模式。
                    hls_cleanup on;    #对多余的切片进行删除。
                    hls_nested on;     #嵌套模式。
            }
        }
    }

    查看已经产生切片视频文件了。其中还有一个index.m3u8。 

    cd /usr/local/nginx/html/hls/a/
    ls

    vlc输入[ http://192.168.174.200/hls/a/index.m3u8 ]即可看到视频

  • 相关阅读:
    SharePoint 2013 安装.NET Framework 3.5 报错
    SharePoint 2016 配置工作流环境
    SharePoint 2016 站点注册工作流服务报错
    Work Management Service application in SharePoint 2016
    SharePoint 2016 安装 Cumulative Update for Service Bus 1.0 (KB2799752)报错
    SharePoint 2016 工作流报错“没有适用于此应用程序的地址”
    SharePoint 2016 工作流报错“未安装应用程序管理共享服务代理”
    SharePoint JavaScript API in application pages
    SharePoint 2016 每天预热脚本介绍
    SharePoint 无法删除搜索服务应用程序
  • 原文地址:https://www.cnblogs.com/gmhappy/p/9472365.html
Copyright © 2011-2022 走看看