多协议、性能稳定、丰富API的流媒体服务器软件
如何实时地修改播放请求中的StreamName?
这个例子是一个IMediaStreamNameAliasProvider2接口的实现,它提供了一个基本的框架,当Wowza Streaming Engine接收到一个播放请求后,它可以拦截这个请求并将流的名字(Stream Name)或者说路径修改为另一个名字。

这个接口提供了几个resolvePlayAlias 方法,当播放器每一次开始播放一个流时,根据不同协议,就会触发其中一个resolvePlayAlias方法。 播放请求中的Stream name会被传递到这个方法中,并返回一个新的Stream Name

这个接口还提供了几个resolveStreamAlias 方法,当你用Wowza Streaming Engine Manager管理界面、StartUpStreams.xml 或 MediaCaster API 去启动一个MediaCaster(Wowza Streaming Engine的一个内部负责从远端拉流的模块)类型的流时,系统会调用这些方法。 当你在使用Live repeater、SHOUTcast/IceCast re-streaming 以及 RTSP/RTP re-streaming 功能时,系统会用到这个功能。它通常被用于将一个复杂、较长的流地址转变为一个简单而短小的流名字。 例如你要拉一个SHOUTcast音乐流,Url地址是http://192.168.1.7/myradiostation ,那么你可以创建一个别名,叫做myradiostation。 你可以用这个新的别名代指这个SHOUTcast流。

注意:在使用SMIL文件配置的多码率流时,smil的名字会先被解析,然后才会继续解析Smil里面的每一个流的名字。

注意: 在你使用了IMediaStreamNameAliasProvider2接口后,就不能使用Wowza StreamNameAlias模块或.stream文件,因为它们本来就是这个IMediaStreamNameAliasProvider2的一个实现。

注意: 这个功能只能改写流的名字(stream name),它不会去做重定向之类的事。

package com.wowza.wms.example.module;

import com.wowza.wms.application.*;
import com.wowza.wms.client.IClient;
import com.wowza.wms.httpstreamer.model.IHTTPStreamerSession;
import com.wowza.wms.mediacaster.IMediaCaster;
import com.wowza.wms.module.*;
import com.wowza.wms.rtp.model.RTPSession;
import com.wowza.wms.stream.IMediaStream;
import com.wowza.wms.stream.IMediaStreamNameAliasProvider2;
import com.wowza.wms.stream.livepacketizer.ILiveStreamPacketizer;

public class ModuleStreamNameAliasExample extends ModuleBase implements IMediaStreamNameAliasProvider2 {

	public void onAppStart(IApplicationInstance appInstance) {
		String fullname = appInstance.getApplication().getName() + "/"
				+ appInstance.getName();
		getLogger().info("onAppStart: " + fullname);
		
		appInstance.setStreamNameAliasProvider(this);
	
	}

	public String resolvePlayAlias(IApplicationInstance appInstance,
			String name, IClient client) {
		getLogger().info("Resolve Play Flash: " + name);
		
		return name;
	}

	public String resolvePlayAlias(IApplicationInstance appInstance,
			String name, IHTTPStreamerSession httpSession) {
		getLogger().info("Resolve Play HTTPSession: " + name);
			return name;
	}

	public String resolvePlayAlias(IApplicationInstance appInstance,
			String name, RTPSession rtpSession) {
		getLogger().info("Resolve Play RTPSession: " + name);
		return name;
	}

	public String resolvePlayAlias(IApplicationInstance appInstance,
			String name, ILiveStreamPacketizer liveStreamPacketizer) {
		getLogger().info("Resolve Play LiveStreamPacketizer: " + name);
		return name;
	}

	public String resolveStreamAlias(IApplicationInstance appInstance,
			String name, IMediaCaster mediaCaster) {
		getLogger().info("Resolve Stream Mediacaster: " + name);
		return name;
	}

	public String resolvePlayAlias(IApplicationInstance appInstance, String name) {
		getLogger().info("Resolve Play: " + name);
		return name;
	}

	public String resolveStreamAlias(IApplicationInstance appInstance,
			String name) {
		getLogger().info("Resolve Stream: " + name);
		return name;
	}
}
将以上代码编译后,在/conf/[app-name]/Application.xml文件的<Modules>列表中添加下面的Module:
<Module> 
	<Name>ModuleStreamNameAliasExample</Name> 
	<Description>ModuleStreamNameAliasExample</Description> 
	<Class>com.wowza.wms.example.module.ModuleStreamNameAliasExample</Class> 
</Module>