这是自己搭建直播服务器、开发直播平台系列的文章,前面两篇文章分别为:

这篇文章是在上面多频道输入输出和权限控制的基础上进行的。

一、目标

1、实现直播状态的更改:

(直播状态的更改主要是为了显示,在前端刷新列表的时候,用于判断那些直播间在直播,哪些不在。):

  • 用户开始推流之后,操作数据库,更改直播状态,显示直播间已经开始直播。
  • 用户推流结束或者关闭软件后,操作数据库,更改直播状态。

2、实现简单的人数统计(暂用):

这里实现人数统计是基于数据库的(rtmp-nginx-module本身是有一个模块的,可以实现当前视频流观看人数的统计),这里只是简单的实现自增和自减数据库。

  • 用户观看打开页面开始观看直播,数据库字段自增1
  • 用户关闭页面后,连接断掉,数据库字段自减1

二、rtmp服务器的配置

在 实现nginx-rtmp-module多频道输入输出与权限控制 这篇文章里,我们配置了 on_publish 这个参数。

主要实现多频道和权限控制,用户在正式推流到服务器之前首先去配置的url中验证一下权限(具体的可以看上篇文章)。

目前我们需要配置更多的参数:

    application myapp{
live on; # live on表示开启直播模式
on_publish http://192.168.124.125/on_publish.html;
on_publish_done http://192.168.124.125/on_publish_done.html;
on_play http://192.168.124.125/on_play.html;
on_play_done http://192.168.124.125/on_play_done.html;
}

可以看到,除了 on_publish ,我们还配置了 on_publish_done、on_play、on_play_done 三个参数,后面也是一个url。

这三个参数也是非常容易理解的,分别对应如下:

  • on_publish_done —— 推流结束
  • on_play —— 客户端播放
  • on_play_done —— 客户端播放结束

对上面三个参数的具体解释和用法可以看rtmp的文档:

经过上面的配置,用户推送或者推送结束、或者用户播放和播放结束都能够触发URL,同时操作数据库即可。

三、程序部分注意问题

配置好了URL,就需要进行操作,但是会发现一个问题:

  • 不知道用户观看的是哪个流、或者不知道推送结束的是哪个流

上面问题可以看 实现nginx-rtmp-module多频道输入输出与权限控制 这篇文章里面接收的 name参数 ,上面的配置中所有的推送都会携带一个name参数,而这个name是不可变的,用于标识当前流名称。

用我写的简单举个例子:

  • 下面是基于thinkphp5框架写的。
  • url与函数不匹配是因为我做了route。

可以看到,每次的操作都会获得一个name的参数,当然,除了name之外每个不同的配置有不同的参数可以获取,具体可以去 文档 了解一下

    /**
* 用户直播结束的回调事件
* - 用户直播结束后,将status设置成0,标注该房间未在推流
* @param Request $request
*/
function onPublishDone(Request $request){
// 获得stream name
$name=trim($request->param('name'));
// 关闭直播 设置status 为 0
Db::name('room')->where(['guid'=>$name])->setField('status',0);
return json('')->code(200)->header(['关闭直播']);
}
/**
* 用户观看直播的回调事件
*/
function onPlay(Request $request){
// 获得视频流地址
$name=trim($request->param('name'));
// 有人加入观看,设置people +1
Db::name('room')->where(['guid'=>$name])->setInc('people');
}
/**
* 用户结束观看直播的回调事件
* @param Request $request
*/
function onPlayDone(Request $request){
// 获得视频流地址
$name=trim($request->param('name'));
// 有人加入观看,设置people -1
Db::name('room')->where(['guid'=>$name])->setDec('people');
}
 

「自己开发直播」rtmp-nginx-module实现直播状态、观看人数控制的更多相关文章

  1. 实时监控、直播流、流媒体、视频网站开发方案流媒体服务器搭建及配置详解:使用nginx搭建rtmp直播、rtmp点播、,hls直播服务配置详解

    注意:这里不会讲到nginx流媒体模块如何安装的问题,只研究rtmp,hls直播和录制相关的nginx服务器配置文件的详细用法和说明.可以对照这些命令详解配置nginx -rtmp服务 一.nginx ...

  2. 「自己开发直播」实现nginx-rtmp-module多频道输入输出与权限控制

    之前写了一篇文章,利用nginx和nginx-rtmp-module实现直播. 不过,之前只是做到了能够直播而已,只能一个人推流,并没有实现多人多频道输入输出,也没有权限控制,只要知道rtmp的URL ...

  3. 这款 IDE 插件再次升级,让「小程序云」的开发部署提速 8 倍

    今年3月份,在阿里云北京峰会上,阿里巴巴正式发布了“阿里巴巴小程序繁星计划”,截至当前,已经有成千上万的开发者加入这个计划,使得小程序得到蓬勃发展,然而不可避免的是,这些服务加重了对云端的开发部署.运 ...

  4. 「查缺补漏」巩固你的Nginx知识体系

    Nginx篇 基本介绍 Nginx是一款轻量级的 Web服务器 / 反向代理服务器 / 电子邮件(IMAP/POP3)代理服务器,主要的优点是: 支持高并发连接,尤其是静态界面,官方测试Nginx能够 ...

  5. 抛开flash,自己开发实现C++ RTMP直播流播放器

    抛开flash,自己开发实现C++ RTMP直播流播放器 众所周知,RTMP是以flash为客户端播放器的直播协议,主要应用在B/S形式的场景中.本人研究并用C++开发实现了RTMP直播流协议的播放器 ...

  6. Android流媒体开发之路二:NDK开发Android端RTMP直播推流程序

    NDK开发Android端RTMP直播推流程序 经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行 ...

  7. 微信小程序开发平台新功能「云开发」快速上手体验

    微信小程序开发平台刚刚开放了一个全新的功能:云开发. 简单地说就是将开发人员搭建微信小程序后端的成本再次降低,此文刚好在此产品公测时,来快速上手看看都有哪些方便开发者的功能更新. 微信小程序一直保持一 ...

  8. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  9. 实战开发一个Nginx扩展 (Nginx Module)

    repo地址 https://github.com/wujunze/nginx-http-echo-module nginx_module_echo 使用echo指令输出一个字符串 Nginx 版本 ...

随机推荐

  1. CocoaPods学习系列2——使自己的项目支持CocoaPods管理

    该篇记录使自己的项目支持CocoaPods管理. 要达到这一目的,需要如下步骤: 1.将自己的项目提交到github,添加开源协议license 2.添加podspec文件 3.验证podspec,成 ...

  2. Windows下搭建Apache+Django+Python Web服务环境

    最近在学Django,想用Apache搭建一个服务器环境,因此在网上看了好多资料,很多都是用Python2.6和Apache2.2搭建的环境,不过我还是想用Python35和Apache24来搭建,具 ...

  3. JNIjw03

    1.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_JNIjw03.h" JNIEXPORT void JNICALL ...

  4. Cacti的基本安装配置

    ////////////////////cacti///////////////////////////常用的监控软件有:cacti.nagios.zabbix等 cacti 重图形.有数据历史.需要 ...

  5. 判断浏览器是否支持某一个CSS3属性

    判断浏览器是否支持某一个CSS3属性 function supportCss3(style) { var prefix = ['webkit', 'Moz', 'ms', 'o'], i, humpS ...

  6. React菜鸟食谱

    JSX 用小括号包裹代码防止分号自动插入的bug,用大括号包裹里面的表达式 切记你使用了大括号包裹的 JavaScript 表达式时就不要再到外面套引号了.JSX 会将引号当中的内容识别为字符串而不是 ...

  7. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syr ...

  8. 在Window工作区按下鼠标左键拖动窗体

    Window.DragMove(): 允许使用在窗口工作区的暴露区域上方按下其鼠标左键的鼠标来拖动窗口.(窗口工作区:除去窗体的title.bottom后的剩余部分空间) 使用该方法时注意:一定要在鼠 ...

  9. Mybatis输入和输出映射(parameterType和resultType的区别)

    parameterType                                                                             resultType ...

  10. nyoj-5-kmp裸题

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=5 kmp统计匹配串出现次数,贼尴尬好久没做字符串题目,一开始求得是文本串的next ...