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

之前写了一篇文章,利用nginx和nginx-rtmp-module实现直播。

不过,之前只是做到了能够直播而已,只能一个人推流,并没有实现多人多频道输入输出,也没有权限控制,只要知道rtmp的URL就能够推送。

本文是在之前文章的基础上继续的。

原文地址:通过Nginx-rtmp-module搭建直播服务器并实现直播

一、权限控制方面

说实话,我查这个查了很久,也没查出个所以然,最后还是花了半天的时间,研究了一下nginx-rtmp-module的文档,最后搞了半天才弄明白。

文档中主要有两个部分需要注意:

live配置的publish_notify部分

https://github.com/arut/nginx-rtmp-module/wiki/Directives#publish_notify

publish_notify中Notify的配置部分

https://github.com/arut/nginx-rtmp-module/wiki/Directives#notify

1、live的publish_notify

所谓的publish_notify是涉及publish_notify默认是off的,主要涉及推送的过程中一些事件。

开启publish_notify即可进行Notify的配置操作。

publish_notify on;

2、Notify的配置

Notify的配置相关是涉及直播的事件并执行回调代码。

比如:推流链接、直播开启、直播结束状态,然后异步调用http的链接,进行一些逻辑的处理。

主要的配置参数有下面这些:

on_connect

on_play

on_publish

on_done

on_play_done

on_publish_done

on_record_done

on_update

......

从上面的配置参数可以看出,能够触发连接、直播、输出、直播结束等等,从而能够进行权限验证、

比如,当触发推流的时候,通过 on_publish http://www.example.com/uri 进行权限控制,接收相关参数并进行控制,如果用户不存在,则不允许推流。

二、多频道输入输出

这里的多频道输入输出意思是:多个人直播,每个人有不同的输出地址。

1、直播推流端

多个人有不同的推流和直播地址,就涉及了直播参数,而实际上,各大平台直播的时候,除了地址,都有一个直播密钥或者是直播码。

以OBS举例,串流类型选择自定义流媒体服务器,然后会出现一个URL和流密钥。

而流密钥就是实现多频道输入输出的重点。

2、rtmp Publish配置

既然需要进行权限控制,就要使用publish,首先进行权限的验证,证明有推流权限。

所以rtmp的配置如下(最后会给出一个完整的配置示例):

因为只是探讨权限控制,因此hls之类的不需要关心,我也注释了。

    #设置直播的application名称是 myapp

    application myapp{

        live on; #live on表示开启直播模式       

        publish_notify on;

        on_publish http://tp5.ptbird-ubuntu/on_publish.html;

        #hls on;

        #hls_path /tmp/hls;

        #hls_fragment 2s;

        #hls_playlist_length 6s;

    }

关键配置是:on_publish http://tp5.ptbird-ubuntu/on_publish.html;

后面的 http://tp5.ptbird-ubuntu/on_publish.html 是假设在web服务器上的处理程序,网上有的将这个逻辑假设在本机nginx,我是建议不要混在一起,直接在别的能够连接的web服务器上部署即可。

我是架设在我的另一台ubuntu kylin的web服务器上。

反正能访问的php处理就可以了,别的说多了也没用。

3、权限验证URL

一个示例的配置如下所示,这是一个模板配置示例。

流密钥的格式是:test?pass=123456,可以看出这个非常像url的get参数配置,test就是用户的name,而pass就是密码。

为什么没有name=test

因为name是rtmp on_publish的默认参数,name是不能更改的。

绝对不能使用GET['name'],而应该使用POST

一开始我总是使用get去获取参数,但是发现一直无法成功,也没办法验证 - -

后来网上查了查,发现不能使用get获取,虽然流密钥的格式像是get类型,但是必须使用POST获取参数。

自定义参数

除了name不能更改之外,其他的都是可以自定义参数的

比如pass=123456&check=123456这样的

三、代码验证权限

1、ThinkPHP5版本

这里使用php进行验证,我顺便将上面 http://tp5.ptbird-ubuntu/on_publish.html 这个url部署在一个thinkphp5的框架中。

因此实际上我是有一个路由的,才会使用html后缀的URL。

// 配置直播推送的url

Route::rule('on_publish','index/Publish/index');

实际的逻辑很简单:

接收两个参数

通过数据库进行验证

返回验证信息

必须返回http头,返回2xx表示成功,3xx表示跳转,4xx表示失败

一般验证失败都是返回404就可以,一定返回标准的404头(一开始我一直验证失败,后面发现,就是返回的头的问题)

而处理的代码如下:

下面代码是基于thinkphp5来处理的,其中没有涉及数据库的操作,只是有两个参数test和test2两个用户,两个密码

而返回http头的状态也是用的thinkphp5的返回方式,下面会有第二种普通的处理方式。

<?php

/**

* Author: root

* Date  : 17-3-19

* time  : 下午4:58

* Site  : www.ptbird.cn

* There I am , in the world more exciting!

*/

namespace app\index\controller;

use think\Request;

class Publish {

    // index

    public function index(Request $request){

        // 接受name和pass param可以自动选择get或者是post

        $name=$request->param('name');

        $pass=$request->param('pass');

        // 设置用户名和密码

        $savename= "test";

        $savepass = "123456";

        if(empty($name) || empty($pass)){

            echo "串码流不正确";

            // 这个是thinkphp5的返回头信息的函数

            return json('')->code(404)->header(['Not Found']);

        }else{

            if(strcmp($name,$savename)==0 && strcmp($pass,$savepass)==0){

                // 默认是返回2xx的头,因此不需要进行控制

                echo "串码流正确";

                // 我在这里添加了另一个test2 和 123456的用户

            }else if(strcmp($name,'test2')==0 && strcmp($pass,'123456')==0){

                echo "串码流正确";

            }else{

                echo "串码流不正确";

                return json('')->code(404)->header(['Not Found']);

            }

        }

    }

}

2、普通的php验证

下面的代码,是网上的代码,一个道理,就不多说了。

// ?user=user&pass=pass

@$name = $_POST['name'];

@$pass = $_POST['pass'];

$savename= test;

$savepass = password;

if(empty($name) || empty($pass)){

    echo "串码流不正确!";

    header('HTTP/1.0 404 Not Found');

}else{

    if (strcmp($name, $savename) == 0 && strcmp($pass, $savepass) == 0) {

        echo "串码流正确!";

    } else {

        echo "串码流不正确!";

        header('HTTP/1.0 404 Not Found');

    }

}

四、直播与观看直播

经过上面的配置,现在可以进行多人直播。

上面的操作中我有两个用户,一个是test,另一个是test2,现在分别使用这两个用户进行直播。

1、test用户的直播 使用OBS 18

2、test2用户的直播 使用obs 0.65

3、test3用户的直播(失败)

将用户名设置成test3

因为返回了404,因此直播失败。

五、总结

on_publish可以实现权限控制,而其他的notify参数,比如on_connect可以设置当用户进行推流之后,就可以设置用户的直播状态为进行直播等等。

之后再继续研究....

文章已经结束啦

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容