windows32下搭建基于nginx的rtmp流媒体服务器

    这几天看到实验室里面的几个师兄个个都在搞这个,本着好奇地心里去看看,并自己动手简单的搭一下

这个简单的流媒体服务器来实现实时直播功能,过程还算流畅。

首先,我们需要清楚,流媒体服务器的实现流程是咋样的:

分三部分来理解,推流端,拉流端,服务器端。其中涉及的编码以及解码,我就不详细介绍了如图。


windows32下搭建基于nginx的rtmp流媒体服务器_第1张图片

推流端:这个的选择可以有很多,比如

1.使用OBS推流 (下载地址:https://obsproject.com/)

2.使用第三方推流SDK,这个是百度云的一个SDK,无需收费,是一个Eclipse项目,不过AS也是支持的,导入便可(https://cloud.baidu.com/doc/Downloadcenter/Push.html#.E7.89.88.E6.9C.AC.E6.9B.B4.E6.96.B0.E8.AF.B4.E6.98.8E)

3.使用开源项目推流(https://github.com/begeekmyfriend/yasea)导入后,修改下rtmp链接。

4.利用ffmpeg推流,这个很火对直播而言(https://github.com/WritingMinds/ffmpeg-android-java)

以上四种方法,都可以用来进行推流。其中最简淡的是第一种直接用市面上已经有的软件推流,只需要会用就好。

如果只是想我一样只是单纯想去了解一下,那么使用这个会快一点,有时间最好全部都试试。OBS的具体操作的话,我就不多说了


windows32下搭建基于nginx的rtmp流媒体服务器_第2张图片

刚开始可以选择窗口捕获。


windows32下搭建基于nginx的rtmp流媒体服务器_第3张图片

我的服务器一般是开着的,所以,如果哪位哥们想测试,可以使用上面的rtmp地址,不过,不允许哪位黑客大兄弟黑了哈,

这服务器啥都没有,黑的话没意思!



windows32下搭建基于nginx的rtmp流媒体服务器_第4张图片

在这里选择开始或者结束,现在这张图里他是处于推流状态的。

下面这个是我用上面介绍的一个集成项目(移动端的)

windows32下搭建基于nginx的rtmp流媒体服务器_第5张图片
图片发自App

windows32下搭建基于nginx的rtmp流媒体服务器_第6张图片
图片发自App


依次的功能是,开始推流,摄像头选择(前后),录屏,软硬编码器的选择(这里推荐使用硬编码器),。。。上面还有美颜的一些效果


拉流端:拉流端也可以有多个选择,这里推荐使用VCL

(不为啥,因为我用的就是它,你也可以使用其他的)

下载地址:http://www.videolan.org/vlc/)


windows32下搭建基于nginx的rtmp流媒体服务器_第7张图片

它的rtmp拉流地址是和推流端的一样的,输入点击播放即可。

服务器端(重点,这里只是讲了nginx+rtmp,还有其他方式来实现,其实,服务器端的最重要的一点就是编码和解码,

你也可以使用第三方的一些API来进行,这个无所谓,这里主要讲的是如何在啊里云的服务器上搭建这个,注意一下我的

服务器部署的系统是win7 32位的,这个其实不影响,我在nginx官网哪里看到过,现在的nginx是没有64位的,都是

32位的通用版,意思是,无论你的系统是32位还是64位并不影响)

在这之前你需要有一个自己的服务器,阿里云上或者其他地方,租也行买也行。如果你还是一个学生,可以租一下啊里云的。

具体怎么去租我就不一一介绍了.

1.下载nginx开源包和插件

下载链接: http://nginx-win.ecsds.eu/download/nginx 1.7.11.3 Gryphon.zip

下载链接: https://github.com/arut/nginx-rtmp-module/releases 下载v1.2.0版zip格式

下载下来后,将nginx-1.7.11.3-Gryphon解压后的nginx-1.7.11.3-Gryphon

(这里我是放到C:\nginx-1.7.11.3-Gryphon的),

nginx-rtmp-module文件解压后放到C:\nginx-1.7.11.3-Gryphon\nginx-rtmp-module,注意里面需要有


windows32下搭建基于nginx的rtmp流媒体服务器_第8张图片



这个文件必须要有。

这个文件是下面这个服务器使用监听情况的主要文件


windows32下搭建基于nginx的rtmp流媒体服务器_第9张图片

这个时候搭建工作基本已经完成了,剩下的就是修改配置了,但是在此之前我们还需要下载msvcr100.dll这个文件,因为在运行的时候会出现提示缺少这个文件无法运行的提示。

只要下载好这个文件,x64版本的放到C:\WINDOWS\SYSTEM32下,x86版本放到C:\WINDOWS\SYSWOW64下,接着重启系统。

下面来修改conf配置文件(配置文件位于C:\nginx-1.7.11.3-Gryphon\conf下)

复制nginx-win.conf文件,修改名称为nginx.conf,将下面代码复制进去后保存。


#user  nobody;

# multiple workers works !

worker_processes  2;

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {

    worker_connections  8192;

    # max value 32768, nginx recycling connections+registry optimization =

    #  this.value * 20 = max concurrent connections currently tested with one worker

    #  C1000K should be possible depending there is enough ram/cpu power

    # multi_accept on;

}

rtmp {

    server {

        listen 1935;

        chunk_size 4000;

        application live {

            live on;

        }

    }

}

http {

    #include      /nginx/conf/naxsi_core.rules;

    include      mime.types;

    default_type  application/octet-stream;

    #log_format  main  '$remote_addr:$remote_port - $remote_user [$time_local] "$request" '

    #                  '$status $body_bytes_sent "$http_referer" '

    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

#    # loadbalancing PHP

#    upstream myLoadBalancer {

#        server 127.0.0.1:9001 weight=1 fail_timeout=5;

#        server 127.0.0.1:9002 weight=1 fail_timeout=5;

#        server 127.0.0.1:9003 weight=1 fail_timeout=5;

#        server 127.0.0.1:9004 weight=1 fail_timeout=5;

#        server 127.0.0.1:9005 weight=1 fail_timeout=5;

#        server 127.0.0.1:9006 weight=1 fail_timeout=5;

#        server 127.0.0.1:9007 weight=1 fail_timeout=5;

#        server 127.0.0.1:9008 weight=1 fail_timeout=5;

#        server 127.0.0.1:9009 weight=1 fail_timeout=5;

#        server 127.0.0.1:9010 weight=1 fail_timeout=5;

#        least_conn;

#    }

    sendfile        off;

    #tcp_nopush    on;

    server_names_hash_bucket_size 128;

## Start: Timeouts ##

    client_body_timeout  10;

    client_header_timeout 10;

    keepalive_timeout    30;

    send_timeout          10;

    keepalive_requests    10;

## End: Timeouts ##

    #gzip  on;

    server {

        listen      80;

        server_name  localhost;

        location /stat {

            rtmp_stat all;

            rtmp_stat_stylesheet stat.xsl;

        }

        location /stat.xsl {

            root nginx-rtmp-module/;

        }

        location /control {

            rtmp_control all;

        }

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        ## Caching Static Files, put before first location

        #location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {

        #    expires 14d;

        #    add_header Vary Accept-Encoding;

        #}

# For Naxsi remove the single # line for learn mode, or the ## lines for full WAF mode

        location / {

            #include    /nginx/conf/mysite.rules; # see also http block naxsi include line

            ##SecRulesEnabled;

        ##DeniedUrl "/RequestDenied";

        ##CheckRule "$SQL >= 8" BLOCK;

        ##CheckRule "$RFI >= 8" BLOCK;

        ##CheckRule "$TRAVERSAL >= 4" BLOCK;

        ##CheckRule "$XSS >= 8" BLOCK;

            root  html;

            index  index.html index.htm;

        }

# For Naxsi remove the ## lines for full WAF mode, redirect location block used by naxsi

        ##location /RequestDenied {

        ##    return 412;

        ##}

## Lua examples !

#        location /robots.txt {

#          rewrite_by_lua '

#            if ngx.var.http_host ~= "localhost" then

#              return ngx.exec("/robots_disallow.txt");

#            end

#          ';

#        }

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

        }

        # 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; # single backend process

        #    fastcgi_pass  myLoadBalancer; # or multiple, see example above

        #    fastcgi_index  index.php;

        #    fastcgi_param  SCRIPT_FILENAME  $document_root$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 spdy;

    #    server_name  localhost;

    #    ssl                  on;

    #    ssl_certificate      cert.pem;

    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_prefer_server_ciphers On;

    #    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    #    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!eNULL:!MD5:!DSS:!EXP:!ADH:!LOW:!MEDIUM;

    #    location / {

    #        root  html;

    #        index  index.html index.htm;

    #    }

    #}

}


windows32下搭建基于nginx的rtmp流媒体服务器_第10张图片

到这里,就基本上可以了,然后就是启动它

这里简单的介绍一下,在cmd里面一些常用操作nginx的命令

(1)启动:


start nginx 或 nginx.exe(使用这个会把cmd给卡死,而没办法输入其他命令)


注:建议使用第一种,第二种会使你的cmd窗口一直处于执行中,不能进行其他命令操作。


(2)停止:


nginx.exe -s stop


stop是快速停止nginx,可能并不保存相关信息;


nginx.exe -s quit


quit是完整有序的停止nginx,并保存相关信息。


(3)重新载入Nginx:


nginx.exe -s reload


当配置信息修改,需要重新载入这些配置时使用此命令。


(4)重新打开日志文件:


nginx.exe -s reopen


(5)查看Nginx版本:


nginx -v


windows32下搭建基于nginx的rtmp流媒体服务器_第11张图片

(最好别用双击去启动这个应用,不然会报错,操作它都是用命令行的,这里需要注意一下自己的断口没有被占用,特别是80端口,

如果有被占用的情况,那就去任务管理器里面kill它,而且需要停掉本身自带的IIS服务器一般,这个会占用80端口)

这时,打开服务器上的浏览器输入 http://127.0.0.1/,如果你看到这个说明你的nginx服务器已经搭建好了


windows32下搭建基于nginx的rtmp流媒体服务器_第12张图片

整个服务器端我们需要注意的,就是我们刚刚写进去的nginx.conf

文件,而这个文件里面需要注意的就是我们加入的rtmp模块(俄罗斯人民发明的nginx,里面本身是没有rtmp,如果你需要

,就加进去,当然还有其他的模块,nginx功能还是很强的,具体的话,同志就慢慢探索了)


rtmp {

    server {

        listen 1935;

        chunk_size 4000;

        application live {

            live on;

        }

    }

}

Nginx的推流地址格式为:rtmp://云服务器公网IP地址/live/xxxxx(这里的xxxxx为任意字符)


对比我们的rtmp地址rtmp://123.56.9.157:1935/live,这里的1935是监听端口(如果你用的是阿里云的服务器,记住这里是需要自己去开启1935这个端口的,而且,服务器的防火墙也需要关闭) 其中要重点说一下live,这里的live就是conf配置文件中的application后面的字符,可以任意修改,这里的意思相当于live为直播应用,而xxxxx为直播应用下的房间,可以有很多个。

ok,讲到这里就全部结束了,如果在这个过程中入到问题,慢慢的排查,是在没办法可以给我留言,我看见就回。


最后附上两张领袖的照片!哈哈

windows32下搭建基于nginx的rtmp流媒体服务器_第13张图片
图片发自App

windows32下搭建基于nginx的rtmp流媒体服务器_第14张图片
图片发自App

你可能感兴趣的:(windows32下搭建基于nginx的rtmp流媒体服务器)