如何为Wowza Stream Engine 4的直播业务配置类似电视台的节目编排表?
转载请注明:文章来自www.wowza.cn
注意: 要访问最新的技术资料,请访问http://www.ttstream.com/wowza/
你可以用SMIL文件为Wowza Media Server上的直播业务配置一个节目编排表。就像电视台那样,编排表中的一个流代表一个频道,每一个频道由多个节目组成播出计划表,这些节目可以是一个或多个视频片段。在一个编排表中可以定义多个频道的播出计划表。每一个播出计划表会指定一个特定的开始播出时间。 www.wowza.cn 当一个播出计划表的播出时间到达时,如果当前频道已经在播出另一个播出计划表的内容,那么这个频道会立刻切换到这个新的播出计划表的内容上。如果一个播出计划表的时间已经过去了,那么这个播出计划表中的内容会被立即播出。

配置

scheduler模块是Wowza Media Server 模块集合的一部分。 要安装这个模块集合,下载并解压缩Wowza Media Server 模块集合,将压缩包中的/lib/wms-plugin-collection.jar 文件拷贝到Wowza Media Server的[install-dir]/lib 文件夹下,然后重启Wowza Media Server。 同时,如果你需要对它的功能进行扩展,我们在压缩包中提供了完整的源代码。

ServerListenerStreamPublisher server listener 和 ModuleStreamPublisher 应用模块是使用scheduler的两种方式。它们可以一起配合使用,也可以分开独自使用,具体看你的需求。

注意: 这个server listener 和 module 最后更新于2013-09-25,解决了一些bug。请确定您下载的是最新的Module Collection 以得到最近的改进。
Server listener: 当Wowza Media Server 启动后,ServerListenerStreamPublisher server listener 会加载指定应用(application)下的节目编排表,然后其中的频道(也就是一个stream)就会保持运行直到服务器被关闭。但是在这个过程中,如果SMIL文件中的编排信息有修改,这个server listener无法重新加载SMIL文件中的节目编排信息。

Application module: ModuleStreamPublisher 应用模块可以被用在任何一个应用(application)上,在这个应用启动时加载这个应用的节目编排表信息,在这个应用被关闭时丢弃直播流。SMIL文件在被修改后可以被重新加载。这个模块可以为配置在server listener中的SMIL文件提供重新加载的功能。 它也可以用在每一个独立的应用上,为每一个应用提供自己的节目编排表。

一个应用通常是在直播流被请求时加载。如果节目编排表必须在Wowza Media Server 启动时启动并且ModuleStreamPublisher被用于自己本身(对应于用于Server Listener),有一个单独的server listener 可以被用于在服务器启动时加载多个应用。请阅读How to use a ServerListener to load and lock an appinstance (IServerNotify2) 获得更多细节。

注意: 每一个可以使用节目编排表功能的应用(application)都必须采用live stream type。

配置server listener

要配置ServerListenerStreamPublisher server listener, 请用文本编辑器打开[install-dir]/conf/Server.xml 文件,按下面编辑它:

  1. Server/ServerListeners中添加一个server listener:
    Code:
    <ServerListener>
    	<BaseClass>com.wowza.wms.plugin.collection.serverlistener.ServerListenerStreamPublisher</BaseClass>
    </ServerListener>
  2. 如果需要,你可以添加下面的属性参数来告诉server listener是哪一个vhost和application要运行节目编排表(schedule)功能(默认如下):
    Code:
    <!--  Vhost name to start the application on. -->
    <Property>
    	<Name>streamPublisherVHost</Name>
    	<Value>_defaultVHost_</Value>
    </Property>
    
    <!--  Application/AppInstance name to start the schedule on. -->
    <Property>
    	<Name>streamPublisherApplication</Name>
    	<Value>live/_definst_</Value>
    </Property>
    注意: 这些属性的名字可能和以前版本的不一样。老版本的属性名依然可以用。
  3. 如果需要,你可以添加下面的属性来控制节目编排表功能(schedule)是如何被加载的(默认如下):
    Code:
    <!-- The name of the SMIL file that will be used for this schedule. The SMIL file must be located in the application's Streams/StorageDir, which is [install-dir]/content by default. -->
    <Property>
    	<Name>streamPublisherSmilFile</Name>
    	<Value>streamschedule.smil</Value>
    </Property>
    
    <!-- Pass metadata from the source videos to the stream. Default is true but can cause problems with some players when the metadata has duration values -->
    <Property>
    	<Name>streamPublisherPassMetaData</Name>
    	<Value>true</Value>
    </Property>
    
    <!-- Log when each schedule switch occurs. If a schedule is set but all items are missing, excessive logging can occur. Set this to false to prevent excessive logging -->
    <Property>
    	<Name>streamPublisherSwitchLog</Name>
    	<Value>true</Value>
    </Property>
    注意: 这些每一个属性都将被应用层面的这些属性设置所覆盖,你可以在Application.xml文件中设置这些属性为不同的值。


配置应用模块

要配置ModuleStreamPublisher 的应用模块和server listener 配合使用或这自己单独使用,请用文本编辑器打开每一个要使用节目编排表功能的应用的Application.xml文件,并按下面编辑它:

  1. Add the module to the Application/Modules list:
    Code:
    <Module>
    	<Name>ModuleStreamPublisher</Name>
    	<Description>ModuleStreamPublisher</Description>
    	<Class>com.wowza.wms.plugin.collection.module.ModuleStreamPublisher</Class>
    </Module>
  2. 按照需要,添加下面的属性参数以配置节目编排表scheduler(默认如下)。这里的属性配置将把[install-dir]/conf/Server.xml文件中的配置覆盖掉。 www.wowza.cn
    Code:
    <!-- The name of the SMIL file that will be used for this schedule. The SMIL file must be located in the application's Streams/StorageDir, which is [install-dir]/content by default. -->
    <Property>
    	<Name>streamPublisherSmilFile</Name>
    	<Value>streamschedule.smil</Value>
    </Property>
    
    <!-- Pass metadata from the source videos to the stream. Default is true but can cause problems with some players when the metadata has duration values -->
    <Property>
    	<Name>streamPublisherPassMetaData</Name>
    	<Value>true</Value>
    </Property>
    
    <!-- Log when each schedule switch occurs. If a schedule is set but all items are missing, excessive logging can occur. Set this to false to prevent excessive logging -->
    <Property>
    	<Name>streamPublisherSwitchLog</Name>
    	<Value>true</Value>
    </Property>
    www.wowza.cn
  3. 如果有多个应用需要在Wowza Media Server启动时启动,请配置ServerListenerLoadAndLockAppInstance server listener 以加载应用。


为每一个节目编排表schedule配置一个SMIL文件

每一个使用节目编排表功能的应用都要有一个属于自己的SMIL文件。SMIL文件的名字被设置在应用的Application.xml文件的streamPublisherSmilFile 属性中。 SMIL文件必须位于Application.xml文件的Streams/StorageDir属性定义的文件夹下。

至少创建一个直播流,并在这个直播流上创建至少一个播放列表。

  • 对于实时流的直播源,使用-2 作为 start 参数的值。

  • 对于VOD文件, 可以使用0 或任意正数作为start 参数的值。这个整数是以秒为单位的,从这个数值开始的位置播放视频。

  • 如果要播放一个视频源并一直到它结束,请使用-1 作为length 参数的值。任何整数都将导致播放这些秒数的时间。

  • 要循环播放时,请将repeat设置为true。将repeat 设置为 false 将会导致当播放列表中的内容播放完毕后,直播流被关闭。在这之后,播放列表不会再被加载了,除非它在结束之前又被开始加载。

  • scheduled 参数设置为要开始播放的时间。如果这个时间已经过了,直播流将播放这个直播列表中的内容。


你可以创建一个较复杂点的节目编排表,它包含好几个直播流,一个直播流上有好几个播放列表。例如:
Code:
<smil>
    <head>
    </head>
    <body>

        <stream name="Stream1"></stream>
        <stream name="Stream2"></stream>
        
        <playlist name="pl1" playOnStream="Stream1" repeat="true" scheduled="2013-09-25 16:00:00">
            <video src="mp4:sample.mp4" start="5" length="5"/>
            <video src="mp4:sample.mp4" start="50" length="5"/>
            <video src="mp4:sample.mp4" start="150" length="5"/>
        </playlist>

        <playlist name="pl2" playOnStream="Stream1" repeat="true" scheduled="2013-09-25 16:30:00">
            <video src="mp4:sample.mp4" start="0" length="-1"/>
        </playlist>
        
        <playlist name="pl3" playOnStream="Stream2" repeat="true" scheduled="2013-09-25 16:00:00">
            <video src="mp4:sample.mp4" start="30" length="5"/>
        </playlist>

    </body>
</smil>
www.wowza.cn

重新加载节目编排表

要重新加载某一个应用的节目编排表,这个应用必须配置ModuleStreamPublisher模块。在重新加载之前,SMIL文件可以被修改为最新的编排表。

可以用下面的方法重新加载节目编排表:

  1. 创建一个简单的Flash应用,它包含调用Wowza Media Server的方法:
    Code:
    netconnection.call("loadSchedule",new Responder(function(msg:String):void
    {
    	trace(msg);
    }
    ));
    当节目编排表需要被重新加载时,就调用这个这个方法。

    你可以下载ModuleStreamPublisherClient.zip, 这里面包含了一个已经编译好的实现了这个功能的Flash 应用。

  2. 使用JConsole 连接你的Wowza Stream Engine 4的JMX接口,然后直接运行module实例的loadSchedule方法。在MBeans tab页中,导航到 AppInstance Modules/ModuleStreamPublisher/Instances/Operations tab页,然后运行 loadSchedule 方法。此外,也有一个unloadSchedule 方法可以被用于关闭直播流。


你可以用你希望的任何播放器播放SMIL文件中定义的直播流,只要使用SMIL文件中的Stream name即可。

当直播流上的播放列表被修改后,Wowza Stream Engine 4将会向每一个连接到这个应用的Flash客户端应用广播一条消息。 你可以通过在你的Flash客户端应用的NetConnection上添加一个叫做"PlaylistItemStart"的回调函数来监听这个消息。例如:
Code:
var clientObj:Object = new Object();
clientObj.PlaylistItemStart(itemName:String):void
{
	trace("Item Name: " + itemName);
});

netconnection.client = clientObj;
netconnection.connect("rtmp://[wowza-ip-address]:1935/[app-name]");