• 基于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 ]即可看到视频

  • 相关阅读:
    AtCoder Beginner Contest 113 D Number of Amidakuji
    UVA
    mt19937 -- 高质量随机数
    牛客网NOIP赛前集训营-提高组(第七场)C 洞穴
    牛客OI周赛4-提高组 C 战争(war)
    牛客OI周赛4-提高组 B 最后的晚餐(dinner)
    bzoj 4318 || 洛谷P1654 OSU!
    Tourists Codeforces
    bzoj 1791 [Ioi2008]Island 岛屿
    洛谷 P2231 [HNOI2002]跳蚤
  • 原文地址:https://www.cnblogs.com/gmhappy/p/9472365.html
Copyright © 2020-2023  润新知