RTMP是一种基于TCP协议的视频流传输协议,默认端口号是1935。
RTMP服务器监听端口,接收来自推流客户端的视频数据,并转发给拉流客户端。
支持一人推送,万人观看!像电视直播或者游戏直播都是采用该技术。
nginx-rtmp-win32就是这样的一个RTMP服务器;
nginx官方下载的windows版本是不带rtmp模块的,目前最新稳定版本是1.16;
要添加rtmp模块需要自己用源码编译,不过好在有前人做好了win32的移植。
nginx-rtmp-win32在这里下载:https://github.com/illuspas/nginx-rtmp-win32
虽然该项目已经停止更新了,但是对于个人搭建学习和测试用的RTMP服务器还是没有问题的。
有了RTMP服务器,那么还需要客户端软件:
推流可以使用OBS这类软件;
拉流可以使用PotPlayer这类播放器。
直播过程中视频数据流是从OBS传输到nginx再传输到播放器,只要网速够快,就可以获得超低延时的视频直播。
如果想在网页上观看视频直播?
由于浏览器不支持rtmp协议,所以需在网页上嵌入一个adobe flash player插件来接收并播放视频流。
目前好像也有基于js的纯H5播放器可以实现,没有去深入研究。
另外还有一种选择是苹果的HLS技术,HLS技术就是把视频流分成无数个TS视频片段。
再通过HTTP协议传输这些视频片段,实现了浏览器观看视频直播。
目前android和ios的浏览器都支持这种技术。
HLS技术一般只应用于拉流,而推流还是使用RTMP协议。
但由于服务器需要对接收的数据进行分片,直播延时比较大。
nginx-rtmp-win32非常不错,也支持HLS技术。
它可以把接收到的视频流保存为无数个TS文件,并自动生成m3u8列表,浏览器只要访问对应的m3u8就可以观看直播了。
说了这么多理论上的东西,该来实践一下了。
本次实践的内容是使用OBS推流,然后使用HLS技术,在iPhone的浏览器里面观看直播。
首先是编辑nginx的配置文件,打开nginx/conf/nginx.conf
参考下面的参数进行配置:
worker_processes 1;
error_log logs/error.log debug;
events
{
worker_connections 100;
}
#设置RTMP服务器参数
rtmp
{
server
{
listen 1935; #设置监听端口
application live #设置访问路径(rtmp://127.0.0.1/live)
{
live on; #开启rtmp直播功能
deny play all;#禁止RTMP播放(默认推流地址就是播放地址)
hls on; #开启hls功能
hls_path temp/rtmp_temp; #设置hls视频文件存放路径
hls_fragment 5; #设置分片时长(秒)
hls_playlist_length 10; #设置播放列表时长(秒)
hls_continuous off; #不使用连续模式
hls_cleanup on; #自动清理视频文件(这个默认是打开的,可以不用设置)
hls_nested on; #嵌套模式(为每个直播流创建一个子文件夹)
hls_fragment_naming sequential; #ts命令规则为序号递加
}
}
}
#设置HTTP服务器参数
http
{
include mime.types;
default_type application/octet-stream;
server_tokens off;
sendfile on;
server
{
listen 80;
server_name localhost;
#下面是默认的根目录
location /
{
root html;
index index.html index.htm;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /stat
{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl
{
root html;
}
#下面是直播观看地址
location /live
{
alias temp/rtmp_temp;
index index.m3u8;
autoindex on;
types
{
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
}
}
}
配置文件修改好了,就可以双击nginx.exe启动了。
nginx.exe会启动两个进程,并且无法正常关闭,只能使用nginx.exe -s stop来关闭!
先试试用浏览器访问http://127.0.0.1:80,如果能看到页面,说明nginx启动成功了。
接下来就该OBS上场了,进行视频推流了。
OBS是个好东西,这里以抓取屏幕内容,可以自行设置分辨率和码率。
主要说下推流设置:
因为上面的设置一开始遇到了个坑,输入rtmp://127.0.0.1/live/123456提示连接失败!不加123456则成功。
123456是我想使用的直播流名称,因为设置了hls_nested,nginx会在rtmp_temp下面创建123456文件夹。
后来才知道,这个123456要写在下面那个输入框里。
推流成功后,就可以用浏览器打开http://127.0.0.1:80/live/123456/index.m3u8来观看了。
当然PC浏览器不支持HLS技术,所以我们可以用PotPlayer来打开这个链接!
PotPlayer真是windows上最强的本地播放器!
另外再说一点:
如果使用hls直播,不一定要使用nginx的http服务,可以使用IIS或者其它WEB服务器,都是可以的。
因为nginx-rtmp-win32只负责把直播视频流保存为ts文件,而传播这些ts文件是HTTP干的事。
所以nginx-rtmp-win32加上任何HTTP服务器都可以实现hls直播。
只不过刚好nginx本身就是一个HTTP服务器。
还没有评论,来说两句吧...