這是本身搭建直播服務器、開發直播平臺系列的文章,前面兩篇文章分別爲:php

這篇文章是在上面多頻道輸入輸出和權限控制的基礎上進行的。html

1、目標

一、實現直播狀態的更改:

直播狀態的更改主要是爲了顯示,在前端刷新列表的時候,用於判斷那些直播間在直播,哪些不在。):前端

  • 用戶開始推流以後,操做數據庫,更改直播狀態,顯示直播間已經開始直播。
  • 用戶推流結束或者關閉軟件後,操做數據庫,更改直播狀態。

二、實現簡單的人數統計(暫用):

這裏實現人數統計是基於數據庫的(rtmp-nginx-module自己是有一個模塊的,能夠實現當前視頻流觀看人數的統計),這裏只是簡單的實現自增和自減數據庫。nginx

  • 用戶觀看打開頁面開始觀看直播,數據庫字段自增1
  • 用戶關閉頁面後,鏈接斷掉,數據庫字段自減1

2、rtmp服務器的配置

在 實現nginx-rtmp-module多頻道輸入輸出與權限控制 這篇文章裏,咱們配置了 on_publish 這個參數。git

主要實現多頻道和權限控制,用戶在正式推流到服務器以前首先去配置的url中驗證一下權限(具體的能夠看上篇文章)。github

目前咱們須要配置更多的參數:thinkphp

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。數據庫

這三個參數也是很是容易理解的,分別對應以下:json

  • on_publish_done —— 推流結束
  • on_play —— 客戶端播放
  • on_play_done —— 客戶端播放結束

對上面三個參數的具體解釋和用法能夠看rtmp的文檔:bash

r.jpg

通過上面的配置,用戶推送或者推送結束、或者用戶播放和播放結束都可以觸發URL,同時操做數據庫便可。

3、程序部分注意問題

配置好了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'); }