nginx-rtmp-win32搭建RTMP流服务器的一篇笔记

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服务器。