这几天看到实验室里面的几个师兄个个都在搞这个,本着好奇地心里去看看,并自己动手简单的搭一下
这个简单的流媒体服务器来实现实时直播功能,过程还算流畅。
首先,我们需要清楚,流媒体服务器的实现流程是咋样的:
分三部分来理解,推流端,拉流端,服务器端。其中涉及的编码以及解码,我就不详细介绍了如图。
推流端:这个的选择可以有很多,比如
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地址,不过,不允许哪位黑客大兄弟黑了哈,
这服务器啥都没有,黑的话没意思!
在这里选择开始或者结束,现在这张图里他是处于推流状态的。
下面这个是我用上面介绍的一个集成项目(移动端的)
依次的功能是,开始推流,摄像头选择(前后),录屏,软硬编码器的选择(这里推荐使用硬编码器),。。。上面还有美颜的一些效果
拉流端:拉流端也可以有多个选择,这里推荐使用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,讲到这里就全部结束了,如果在这个过程中入到问题,慢慢的排查,是在没办法可以给我留言,我看见就回。
最后附上两张领袖的照片!哈哈