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

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

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

rtmp {  
       server {  
               listen 1935;  
               chunk_size 4096;

application live {  
                       live on;  
                       record off;  
               }  
       }  
  }
 
二. 在obs软件中设定中添加路径,如下图:

 

 

然后点击开始串流,如果看到右下角有数据在传输,代表传输成功。

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

<source src="rtmp://192.168.1.117:1935/live/668" type='rtmp/flv'>
 
四. 查看整体效果

 

 

五. 如此一来,如果有多房间多渠道推流时,只需要修改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中设定为:

 

 

 

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

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

<source src="rtmp://192.168.1.117:1935/live/668" type='rtmp/flv'>
 
五.效果如下:

可以看到,这里的验证码passWord已经传入,并且验证成功。

 

 

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

 

 

 

七.密码正确输入:

 

 

 

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

&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;
版权声明:本文为CSDN博主「echool丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wei389083222/article/details/78721074