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

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

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

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

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


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

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的具体操作的话,我就不多说了


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


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

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



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

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

图片发自简书App

图片发自简书App


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


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

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

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


它的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,注意里面需要有




这个文件必须要有。

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


这个时候搭建工作基本已经完成了,剩下的就是修改配置了,但是在此之前我们还需要下载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;

    #    }

    #}

}


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

这里简单的介绍一下,在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


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

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

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


整个服务器端我们需要注意的,就是我们刚刚写进去的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,讲到这里就全部结束了,如果在这个过程中入到问题,慢慢的排查,是在没办法可以给我留言,我看见就回。


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

图片发自简书App

图片发自简书App
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容