nginx-rtmp多房间和授权实现

nginx-rtmp多房间和授权实现

本篇为nginx-rtmp的进阶篇,实现多房间直播和观看直播并且添加推流的授权验证(用java实现的授权验证)。在阅读时您需要去看简单推流实现,传送门, 如果您已经做到了简单的推流可以跳过,废话不多直接进入主题。


nginx多房间推流

实现多房间的直播原理:在推流的时候指定特定房间的地址,并在浏览器端根据这个每个房间特定的地址来拉取视频流。

一. nginx.conf暂时维持原的配置,如下:

    rtmp {  
        server {  
                listen 1935;  
                chunk_size 4096;  

                application live {  
                        live on;  
                        record off;  
                }  
        }  
   }

二. 在obs软件中设定中添加路径,如下图:

nginx-rtmp多房间和授权实现_第1张图片
然后点击开始串流,如果看到右下角有数据在传输,代表传输成功。

三. 浏览器界面,video.js的地址修改如下:

    <source src="rtmp://192.168.1.117:1935/live/668" type='rtmp/flv'>

四. 查看整体效果
nginx-rtmp多房间和授权实现_第2张图片

五. 如此一来,如果有多房间多渠道推流时,只需要修改obs中的播放地址,并在浏览器中打开对应房间的地址即可。


为房间加上推流验证

在实际场景中,并不是每个人每个人都能往指定地方上推送视频流,而是由主播或者有操作权限的人。当然也nginx-rtmp模块中提供了on_publish,来控制权限。

一. nginx.conf的配置修改如下:

   rtmp {  
        server {  
                listen 1935;  
                chunk_size 4096;  
                application live {  
                        live on;  
                        publish_notify on;
                        on_publish http://192.168.1.117:8081/chat-rest/nlg/auth;
                        record off;  
                }  
        }  
   } 

live on:切换现场模式,即一对多的广播
on_publish :这个指令设置了发布命令回调,如果这个地址返回HTTP 2XX代码继续RTMP会议,如果返回HTTP重定向3XX ,则会重定向到指定rtmp地址上(当然需要配置,这里就不做详细配置了,可以去官方文档中参考配置),如果返回其他RTMP连接断开。

二. on_publish回调地址url:

既然是只有有权限的人才能推流,所以需要一个系统来维护房间、直播用户、授权码这些信息,正如你看到上面配置的chat-rest是这个系统的项目名,验证代码如下:

@Controller
@RequestMapping("/nlg")
public class NlgController {
    @Resource
    private UserService userService;

    @RequestMapping("/auth")
    public @ResponseBody DataVo auth(HttpServletRequest request, HttpServletResponse response,String passWord) {
        DataVo dataVo = new DataVo();
        try {
           if (passWord.equals("123456")){
                Log.logger.info("success:"+passWord);
                dataVo = DataUtil.dataInfo(StatusContant.STATUS_SUCCESS,dataVo,"auth success");
            }else{
                Log.logger.info("fail:"+passWord);
                response.setHeader("liveAuth","authCode error");
                response.setStatus(500);
            }
        } catch (Exception e) {
            Log.logger.info("",e);
            response.setHeader("error","sys error");
            response.setStatus(500);
        }
        return  dataVo;
    }

}

这里模拟了只有用户的passWord为123456时才能授权成功,并且通过验证,否者直接返回500.断开连接。着这个方法中,我们可以添加更多requestParam,并通过自己的业务逻辑来实现。

三. 在obs中设定为:

nginx-rtmp多房间和授权实现_第3张图片

在播放路径/串流码中填写:668?passWord=123456,
这里问号后面的参数会对应到上面验证接口中的参数,并传入验证,如果是多个参数可以用&拼接,eg:668?par1=value1&par2=value2

四. 在浏览器页面中video.js的维持原来配置如下:

<source src="rtmp://192.168.1.117:1935/live/668" type='rtmp/flv'>

五.效果如下:
nginx-rtmp多房间和授权实现_第4张图片
可以看到,这里的验证码passWord已经传入,并且验证成功。

六. 如果密码错误,会在obs上推流时发生错误,如下图所示:

nginx-rtmp多房间和授权实现_第5张图片

七.密码正确输入:

nginx-rtmp多房间和授权实现_第6张图片


小结:在这篇中,我们用到了nginx-rtmp的多房间推流和授权,要完成这些,您需要先去实现简单的推流后再来上手。欢迎大家能多多给出意见,共同进步。

你可能感兴趣的:(直播chat)