欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx + rtmp 流媒体服务器

程序员文章站 2022-07-08 20:07:46
...

目前主流的开源流媒体服务

  • 流媒体解决方案 Live555 (C++)
  • 流媒体平台框架 EasyDarwin (C++,国产精品)
  • 实时流媒体播放服务器程序DarwinStreamingSrvr (C++)
  • Flash流媒体服务器 Red5 (Java)
  • 流媒体服务器 Open Streaming Server (Java)
  • FMS流媒体服务器 (Adobe,收费的)
  • Wowza流媒体服务器(Java)
  • 开源流媒体平台FreeCast(Java)
  • 最后就是我们下面说的 Ngix+RTMP插件

一、视频流的获取,可在电脑安装ffmpeg,采集摄像头的视频流然后推送到流媒体服务器上。

ffmpeg命令格式:

    ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
    ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
    1、参数选项:
    (1) -an: 去掉音频
    (2) -acodec: 音频选项, 一般后面加copy表示拷贝
    (3) -vcodec:视频选项,一般后面加copy表示拷贝
    2、格式:
    (1) h264: 表示输出的是h264的视频裸流
    (2) mp4: 表示输出的是mp4的视频

    (3)mpegts: 表示ts视频流

1.列出可用设备:ffmpeg -list_devices true -f dshow -idummy   (window)

                           ffmpeg -f avfoundation -list_devices true -I '' ''   (Mac)

2.推流:ffmpeg -f dshow -i video="USB2.0 PC CAMERA" -vcodec libx264 -acodec copy  -b 780k -r 60  -preset:v ultrafast -tune:v zerolatency -f flv rtmp://193.112.101.157:1935/hls/test           ------(window)

推流优化:-b 780k -r 60   -b 推流流量  -r 码率

 

-f flv rtmp://IP:1935/hls/test   IP推流地址 test 是文件名,可以随便取

 

二、搭建rtmp + nginx 流媒体服务器(Centos7)

1.下载Nginx解压,并添加rtmp和openssl支持

 


[root~]# wget http://nginx.org/download/nginx-1.12.1.tar.gz 
[root~]# tar -zxvf nginx-1.12.1.tar.gz 

2.下载nginx-rtmp-module 并安装

 


[root~]# yum -y install openssl openssl-devel//安装一下openssl,不然下面可能会报错
[root~]# git clone https://github.com/arut/nginx-rtmp-module.git
[root~]# ./configure --add-module=/替换为自己的安装路径(path/to)/nginx-rtmp-module --with-http_ssl_module
[root~]# make && make install
[root~]# /usr/local/nginx/sbin/nginx //启动nginx

浏览器打开localhost:8080,出现下图成功安装

nginx + rtmp 流媒体服务器

重启nginx后报错,pid丢失:

 

去到 sbin目录下 输入下面的指令

nginx -c /usr/local/nginx/nginx.conf

3.配置nginx.conf

在server里添加下面代码

 

 

在配置文件最后添加下面这段

#HLS配置开始,这个配置为了`客户端`能够以http协议获取HLS的拉流
        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /home/video;
            add_header Access-Control-Allow-Origin *;//跨域配置
            add_header Cache-Control no-cache;
        }
       #HLS配置结束


        #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;
        }

 

    server {  
        listen 1935;  
        ping 30s;  
        notify_method get;  
  
        application myapp {  
            live on;  
            record off;  
            max_connections 1024;  
        }  
  
    #增加对HLS支持开始  
    application hls {  
        live on;  
        hls on;  
        hls_path /home/video/hls;  
        hls_fragment 2s; 
        hls_playlist_length 3s;
    }  
    #增加对HLS支持结束  
    }  
}

 

4.nginx操作:

 

nginx 服务器重启命令,关闭

 

nginx -s reload :修改配置后重新加载生效

 

nginx -s reopen :重新打开日志文件

 

nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确

关闭nginx:

 

nginx -s stop :快速停止nginx

 

quit :完整有序的停止nginx

其他的停止nginx 方式:

ps -ef | grep nginx

kill -QUIT 主进程号 :从容停止Nginx

 

kill -TERM 主进程号 :快速停止Nginx

 

pkill -9 nginx :强制停止Nginx

三、video.js播放m3u8视频文件

<!DOCTYPE html>
<html>
<head>
    <title>videojs播放</title>
    <link href="./video.css?v=bcd2ce1385" rel="stylesheet">
</head>
<body>

    <video id="roomVideo" class="video-js vjs-default-skin vjs-big-play-centered" x-webkit-airplay="allow" poster="" webkit-playsinline playsinline x5-video-player-type="h5" x5-video-player-fullscreen="true" preload="auto">
        <source src="/chat/playlist.m3u8"  type="application/x-mpegURL">
    </video>

    <script src="./video.js?v=fc5104a2ab23"></script>
    <script src="./videojs-contrib-hls.js?v=c726b94b9923"></script>
    
    <script type="text/javascript">
        var myPlayer = videojs('roomVideo',{
            bigPlayButton : false,
            textTrackDisplay : false,
            posterImage: true,
            errorDisplay : false,
            controlBar : false
        },function(){
            console.log(this)
            this.on('loadedmetadata',function(){
                console.log('loadedmetadata');
                startVideo();
            })

            this.on('ended',function(){
                console.log('ended')
            })
            this.on('firstplay',function(){
                console.log('firstplay')
            })
            this.on('loadstart',function(){
                console.log('loadstart')
            })
            this.on('loadeddata',function(){
                console.log('loadeddata')
            })
            this.on('seeking',function(){
                console.log('seeking')
            })
            this.on('seeked',function(){
                console.log('seeked')
            })
            this.on('waiting',function(){
                console.log('waiting')
            })
            this.on('pause',function(){
                console.log('pause')
            })
            this.on('play',function(){
                console.log('play')
            })

        });
        var isVideoBreak;
        function startVideo() {
            myPlayer.play();
            //判断视频是否卡住,卡主3s重新load视频
            var lastTime = -1,
                tryTimes = 0;           
            clearInterval(isVideoBreak);
            isVideoBreak = setInterval(function(){
                var currentTime = myPlayer.currentTime();
                console.log('currentTime'+currentTime+'lastTime'+lastTime);

                if(currentTime == lastTime){
                    myPlayer.currentTime(currentTime+10000);
                    myPlayer.play();
                    if(++tryTimes > 5){
                        alert('您的网速有点慢,刷新下试试');
                        tryTimes = 0;
                    }
                }else{
                    lastTime = currentTime;
                    tryTimes = 0;
                }
            },3000)
        }
    </script>
</body>
</html>