假设nginx直播服务器已经搭建完毕,如果还没有搭建完毕可以查阅利用nginx的nginx-rtmp-module搭建流媒体直播服务器这篇文章。在开发直播项目时推流应该是需要做权限认证的,不是任何人都可以随意向直播服务器推流,这就需要权限认证,实现起来也不复杂,只需要在nginx配置文件中的rtmp->server->application 下配置on_publish选项就可以,下面给出关键示例配置:

application hls {  #rtmp推流请求路径
   live on;
   on_publish http://验证服务器域名/check.php; #授权地址 推流时会请求
   on_publish_done  http://验证服务器域名/check.php; #推流结束时请求
   hls on;
   hls_path /home/wwwroot/video/hls;
   hls_fragment 5s;
}

通过以上配置可以看到on_publish 和面跟的参数是一个授权url ,在推流客户端推流时会请求该url,如果对应的url响应状态码为200则推流会成功,如果返回其他异常状态码404或者500等则会推流失败。
  那么推流时如何向该url地址发送对应的认证信息,请求到对应的url后又如何认证呢,首先看一下推流客户端如何请求,以OBS为例只需要在流名称后加入类似GET请求参数的数据格式即可,假设流名称为edu则流名称可以这样设置edu?password=123456这样就设置了认证密码为123456,在推流时会有几个参数POST到认证url,下面给出示例参数

[app] => hls
[flashver] => LNX 11,2,202,233
[swfurl] => 
[tcurl] => rtmp://推流地址:1935/hls
[pageurl] => 
[addr] => 192.168.8.223
[clientid] => 38
[call] => publish
[name] => edu
[type] => live
[password] => 123456

这样可以在程序中使用$_POST['password']获取到对应的认证密码,并作出对应的处理,示例代码如下

// 如果认证不成功 响应状态码404
if(($_POST['name'] == 'edu') && ($_POST['password'] != '123456')){
	header('HTTP/1.0 404 Not Found');
}

这样就可以作出认证了,当然可以设置多个流名称(频道)对应多个密码。另外on_publish_done配置项和on_publish传递的参数几乎一样,只是on_publish在推流开始时会请求并执行认证流程,而on_publish_done在推流结束时请求。