在Flash播放器中使用RTMP协议时的URL格式
转载请注明:文章来自www.wowza.cn
注意: 要访问最新的技术资料,请访问http://www.ttstream.com/wowza/
许多基于Flash的播放器(带有FLV播放引擎)可以使用一个单一的URL来同时表示与一个Wowza Stream Engine 4的连接(Connection)以及播放某一个媒体流。 www.wowza.cn 实际上,这个URL会被分割为两个部分,一个与服务器进行连接(connection)的url,另一个是媒体流的名字(stream name). 这种扩展的URL格式假定媒体流(stream name)是URL的[path1]/[path2]/[streamName] 部分:

Code:
rtmp://[wowza-address]:[port]/[application]/[appInstance]/[prefix]:[path1]/[path2]/[streamName]
其中:
  • [wowza-address]: 运行Wowza Stream Engine 4的服务器域名或IP地址
  • [port]: 是与服务器建立连接时使用的TCP端口(rtmp & rtmpe = 1935, rtmpt = 80, rtmps = 443)
  • [application]: 应用名
  • [appInstance]: 应用实例名(defaults to _definst_)
  • [prefix]: 内容类型前缀(flv, mp4, mp3 - defaults to flv if omitted)
  • [path1]/[path2]/[streamName]: 媒体流的路径和名字


如果媒体流额名字(stream name)不包含任何的路径,那么上面的URL可以被简写为(省略了[appInstance] 部分):

Code:
rtmp://[wowza-address]:[port]/[application]//[prefix]:[streamName]
这里的重点是,如果stream name包含了路径,那么你必须使用完整的URL格式。www.wowza.cn,在大部分场景下,这意味着必须在[application]的名字后添加_definst_

例如:
(这个例子假定运行Wowza server的服务器域名为mycompany.com,TCP端口为 1935)

如果应用名为vod 媒体流的名字(stream name)是 mycoolvideo.mov ,那么rtmp的url为:

Code:
rtmp://mycompany.com/vod/mp4:mycoolvideo.mov

or:

rtmp://mycompany.com/vod/_definst_/mp4:mycoolvideo.mov
如果应用名为vod ,但媒体流的名字(stream name)是myvideos/mycoolvideo.mov,那么rtmp的url为:

Code:
rtmp://mycompany.com/vod/_definst_/mp4:myvideos/mycoolvideo.mov
注意: 这种情况下,就不能使用简写的URL了。

注意: 另一个问题是关于添加在URL后面的查询参数:
Code:
rtmp://mycompany.com/vod/mp4:mycoolvideo.mov?param1=value1&param2=value2
因为大部分播放器会将这个URL进行分解,查询参数会被认为是属于stream name的一部分,而不属于连接connection的URL。 www.wowza.cn 由于这个原因,在onConnect事件处理时就无法得到查询参数。例如上面的URL会被分解为下面的服务器连接URL和媒体流的名字(stream name):
Code:
Server: rtmp://mycompany.com/vod
Stream: mp4:mycoolvideo.mov?param1=value1&param2=value2
因此你只能通过覆盖play方法来拦截查询参数。例如:
Code:
public void play(IClient client, RequestFunction function, AMFDataList params)
{
	String streamName = params.getString(PARAM1);

	String queryStr = "";
	int streamQueryIdx = streamName.indexOf("?");
	if (streamQueryIdx >= 0)
	{
		queryStr = streamName.substring(streamQueryIdx+1);
		streamName = streamName.substring(0, streamQueryIdx);
	}

	invokePrevious(client, function, params);
}