多协议、性能稳定、丰富API的流媒体服务器软件
如何秒断涉嫌色情内容的直播?

Wowza Streaming Engine非常适合作为直播业务的流媒体服务器,无论是完全靠Wowza软件集群来做直播,直接提供流服务,还是说由Wowza将流推送给CDN,由CDN提供流服务,你可以根据自己的业务要求来做选择。 但是,无论哪一种情况,对于直播业务运营者,必须有能力做到"涉黄秒断"。而Wowza Streaming Engine作为直接接收主播推流的服务器端,也就必须具备这个技术能力。

本文下面就向大家介绍如何实现这个功能:

几个前提,先说明一下:

  • 1. 由于几乎所有的主播推流客户端都采用RTMP协议,因此本文的方案也只针对这个技术场景。

  • 2. 主播推流之前,涉及到验证问题,关于验证,我们也基于Wowza开发了响应的模块,可以与你的系统对接实现rtmp推流验证,但本文的方案不涉及这部分,也就是说假定主播的推流行为已经得到了验证,并且推流成功。

  • 3. 涉嫌色情等非法内容时,这些内容是如何被发现、监测、上报的,本方案也不涉及,假定平台运营方已经得到举报有主播进行非法内容播出,需要采取措施立即断开这个流。

  • 4. 当要断开一个主播推送过来的视频流时,你可能会提供rtmp协议中流的名字(或者叫ID),也可能会提供主播的ID(或者叫UserName、用户名等),由于后者涉及到你平台的信息系统,因此,为了简便期间,我们以流的名字(或者叫ID)为基准,来断开它的流。如果你需要根据主播的ID来操作,那么建议你根据本方案做适当调整,因为主播ID是你直播平台的信息系统范围,我们是无法得知这些信息和相关业务逻辑的。

  • 5. 注意: RTMP流的名字是区分大小写的,不要搞错了。



现在请点击这里下载源代码及编译后的jar文件

简单说一下利用Wowza Streaming Engine扩展模块实现这个功能的基本原理:

  • 1. 利用onStreamCreate接口来监听rtmp输入流的创建动作,当主播推送rtmp流进入Wowza后,这个事件会被触发。在这个事件的回调中再创建一个针对这输入流的事件监听器。

  • 2. 对输入流的事件监听,重点是要监听onPublish事件,当它被触发时,你需要将clientId,streamName以及当前这个IMediaStream的实例保存在当前ApplicationInstance的Propeties中。同时也对onUnPublish事件做监听,当它被触发时,从ApplicationInstance的Propeties中删除之前保存的信息。

  • 3. 在本方案中,clientId,streamName以及当前这个IMediaStream的实例被封装为一个叫做ClientStreamPair的对象,你可以根据自己的需求做调整。

  • 4. 在本方案中,采用了一个HttpProvider来实现对输入流断开的控制,也就是说当你需要断开某一个直播输入流时,你只需要调用一个Http接口,就可以实现。接口形式如下:

    http://wowza-ip-address:port/clientmanager?action=shutdown&streamName=myStream&appName=live
    			    
    wowza-ip-address : 代表你Wowza服务器的对外公开的IP地址

    port: 代表提供http proviver服务的端口

    clientmanager : 代表路径地址,它实际是一个http request的过滤器

    action=shutdown 代表要断开这个流

    StreamName=myStream 代表rtmp输入流的名字

    appName=live 代表你操作的Wowza直播应用名


下面说一下如何安装部署这个Wowza扩展模块:

  • 1.将编译完成后的jar文件,拷贝到Wowza安装目录/lib路径下

  • 2.为你的Wowza应用配置自定义Module,你可以通过管理界面来配置它。名字和描述都可以是任何随便起,只要方便你记忆就好。重点是类包的完整路径为:com.ttstream.wms.module.StreamListenerLoader

  • 3.为你的Wowza配置HttpProvider,你需要在Wowza安装目录/conf/vhost.xml文件中配置它。首先找到你需要承载这个Http provider的端口,比如1935或8086等,在对应的端口下配置HttpProvider。类包的完整路径为:com.ttstream.wms.http.ClientManager。Http request的过滤器为"ClientManager*",它的配置决定了Http接口的访问路径。另外在测试阶段,你可以将AuthenticationMethod设置为None,在功能测试成功后,在加上验证。


    下面是一个例子:
    <HTTPProvider>
    <BaseClass>com.ttstream.wms.http.ClientManager</BaseClass>
    <RequestFilters>clientmanager*</RequestFilters>
    <AuthenticationMethod>none</AuthenticationMethod>
    </HTTPProvider>
    				

    注意,你需要将这个Http provider放在http request过滤器为*的Http provider前一个。

  • 最后重启Wowza服务器,让配置生效。


测试: 测试非常简单,首先推流到Wowza服务器,确认推流成功后,开始播放这个流,播放成功后。用浏览器访问Http provider的调用url,你回得到一个JSON形式的结果,告诉你成功或失败。 如果调用成功,你看看你的直播流是否还在播放?正确的结果应该是:对于已经在播放的流,在本地缓冲播放完毕后,它就会停止,对于新打开的播放器,是无法播放这个流的。


遗留问题:stream.isPlay()这个方法,经测试可能有些bug(但不影响本方案的核心功能)。这个后续会再更新。