Category: FLEX & ACTION SCRIPT


red5教程

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明

http://vsheyan.blogbus.com/logs/46456225.html

公司今天需要装一台RED5的服务器用来开发程序。发现RED5的0.6已经正式放出,以前我写过一篇关于用SVN进行抽取,然后建立RED5项目的文 章。而对于一般的开发者来说,不需要去修改RED5本身的程序,只需要建立自己的应用程序就可以了。现在把建立过程记录下来,希望对各位有所帮助。本文适 合第一次接触RED5(WIN平台下),而不知道如何开始建立自己的应用程序的用户。

流程:

1.下载最新版本的RED5 http://osflash.org/red5

2.安装RED5,注意在安装RED5前要先安装好JRE,安装RED5的时候会要求指定JRE的目录的。

3.到RED5的安装目录,找到doc/templates目录,该目录中存放了一个标准的RED5应用程序模版myapp,将其复制到RED5安装目录 中的webapps目录下,并改名为你喜欢的文件夹名,比如你要开发一个聊天的程序,那么可以把myapp改为myChat,这个名字就是以后你要连接的 服务名了。

4.在WEB-INF中新建一个文件夹src用来存放程序的源代码,新建一个classes文件夹用来存放编译后的文件。

5.打开Eclipse,将工作区指定为RED5安装目录下webapps,然后新建一个项目,项目名为myChat.这个时候你应该发现刚才 myChat中的文件都被加载进来了,我们首先把src目录指定为源代码目录,右键选择src,在弹出的菜单中选择Build Path->Use as Source Folder,即将其指定为代码文件夹。接下来要指定项目的目标目录,在项目名上右键选择Properties,选择Java Bulid Path,在选择Source标签,在下面的Browse中选择Classes目录,将其指定为目标目录。然后选择Libraries,点击Add External JARs,将RED5安装目录下的red5.jar包含进来。

6.这个时候,在Eclipse的左边应该多了WEB-INF/src这样一个东东,我们将要在这里开始写入我们的第一个项目代码。右键选择它,在弹出的 菜单中选择New->Package,新建一个包,举例,包名可以为org.d5.first,然后再在生成的org.d5.first这个包上继 续右键选择New->File,输入文件名Application.java。并在建好的文件中输入以下代码:

package org.d5.first;

import org.red5.server.adapter.ApplicationAdapter;

public class Application extends ApplicationAdapter {

public String login(){
return “Welcome to Chat Servers”;
}

}

7.进行配置。编辑WEB-INF下的red5-web.xml,找到bean id=”web.handler”一句,将class=”XXX”中的XXX位置修改为org.d5.first.Application,这样本程序将 以刚才写的Application来运行。删除后面的bean id=”server.handler…整句,因为我们暂时用不到这个东东。编辑web.xml,找到webAppRootKey,将其下面的 param-value标签中的值修改为/myChat。编辑red5-web.properties,将第一句修改为 webapp.contextPath=/myChat

8.编译项目

9.重新启动RED5服务器

10.在FLASH中新建一个文件,输入以下代码:
import flash.net.NetConnection;
import flash.net.Responder;

var responder:Responder = new Responder(chat);
var nc:NetConnection = new NetConnection();
nc.connect(“rtmp://localhost/mytest”);
nc.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);
function chat(obj:Object):void{
trace(obj);
}
function statusHandler(event:NetStatusEvent):void
{
trace(event.info.code);
switch (event.info.code)
{
case “NetConnection.Connect.Success”:
trace(“The connection was made successfully”);
break;
case “NetConnection.Connect.Rejected”:
trace (“sorry, the connection was rejected”);
break;
case “NetConnection.Connect.Failed”:
trace(“Failed to connect to server.”);
break;
}
}
nc.call(“login”,responder);

运行程序,显示结果为Welcome to Chat Servers。第一个RED5应用程序诞生了,呵呵:)

写了一个swf嵌入html页面中作跨域ajax提交使用,可是发现在IE内核的遨游,360浏览器中第一次载入可以运行,第二次则报对象没有该方法的错误。
google了一下,基本是这些浏览器处理缓存的问题,在swf已存在本地缓存时初始化第一帧的时候会出问题,解决方法1:在嵌入swf处加上?+Math.random()不管用,按照方法2,将

ExternalInterface.addCallback(“ajax”, ajax);

延迟50毫秒执行

setTimeout(function():void{
ExternalInterface.addCallback(“ajax”, ajax);
}, 50);

这样就解决了。。

以前也遇到过,如果在flex里写一as project,swf没有规定固定大小,而是在第一帧运行代码中动态获取stage的宽高的时候,在遨游等浏览器中第二次浏览的时候布局会乱,因为获得的stage宽高都是0,应该也是这个道理,我恨这些二手浏览器啊。

网上搜了一下,老外有篇blog是写这个的,试了一下可以用,原文地址

简单说一下怎么做:

首先,建一个fla,把需要导出的组件拽进舞台(库)中
然后选导出影片
导出对话框选生成swc

然后在在flex中的project 属性里把lib path加上这个swc就可以了

不知道为何直接用flash安装目录里components下的那些swc为什么不行,不过经过以上步骤就可以直接用flash中的组件了~~

其实flash中其他的mc/字体/图片等也可以在link了class后输出swc这么使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package 
{ 
import flash.display.*;
import flash.geom.*;
import fl.transitions.*;
import fl.transitions.easing.*;
import fl.motion.BezierSegment;
 
 
public class MarsFly extends Transition 
{
	private var _origin_x:Number;
	private var _origin_y:Number;
	private var _origin_zoom:Number;
	private var _origin_alpha:Number;
	private var _start_x:Number = 0;
	private var _start_y:Number = 0;
	private var _control_x:Number = 0;
	private var _control_y:Number = 0;
	private var _start_zoom:Number = 2.5;
	private var _start_alpha:Number = 0;
	private var _bezier:BezierSegment;
 
    /**
     * @private
     */ 
	override public function get type():Class
	{
		return MarsFly;
	}
 
 
 
    /**
     * @private
	 * @param transParams - 参数zoom,alpha,x 起始点x,y 起始点y,cx 控制点x,cy 控制点y
     */ 
	function MarsFly (content:MovieClip, transParams:Object, manager:TransitionManager) 
	{
		super(content, transParams, manager);
		_origin_x = this.manager.contentAppearance.x;
		_origin_y = this.manager.contentAppearance.y;
		_origin_zoom = this.manager.contentAppearance.scaleX;
		_origin_alpha = this.manager.contentAppearance.alpha;
		_start_x = (transParams.x)?transParams.x:0;
		_start_y = (transParams.y)?transParams.y:0;
		_start_zoom = (transParams.zoom)?transParams.zoom:2.5;
		_start_alpha = (transParams.alpha)?transParams.alpha:0;
		_control_x = transParams.cx;
		_control_y = transParams.cy;
 
		_bezier = new BezierSegment(new Point(_start_x, _start_y),
									new Point(_start_x, _start_y),
									new Point(_control_x, _control_y),
									new Point(_origin_x, _origin_y)
									);
	}
 
    /**
     * @private
     */     
	override protected function _render(p:Number):void 
	{
		var point:Point = this._bezier.getValue(p);
		this._content.x = point.x;//this._start_x + (this._origin_x - this._start_x) * (Math.sin(p*Math.PI/2));
		this._content.y = point.y;//this._start_y + (this._origin_y - this._start_y) * (Math.cos((1-p)*Math.PI/2));
		this._content.alpha = this._start_alpha + (this._origin_alpha - this._start_alpha) *p;
		this._content.scaleX = this._content.scaleY = this._start_zoom + (this._origin_zoom - this._start_zoom) *p;
	}
 
}
 
 
 
}

调用时

1
2
3
4
5
6
7
8
9
import fl.transitions.*;
import fl.transitions.easing.*;
 
btn1.addEventListener(MouseEvent.CLICK, function (event){
TransitionManager.start(img1_mc, {type:MarsFly, direction:Transition.OUT, duration:2, easing:Strong.easeOut, x:300,y:300, cx:300, cy: 0,zoom:5,alpha:0.1}); 														
														});
 
btn2.addEventListener(MouseEvent.CLICK, function (event){
TransitionManager.start(img1_mc, {type:MarsFly, direction:Transition.IN, duration:2, easing:Strong.easeOut,x:300,y:300, cx:300, cy: 0,zoom:0.1,alpha:0}); 																										});

运行时共享库的作用是在swf中动态加载外部库,使用库中的资源等等,以下是例子:

1. 新建一fla,命名为Lib.fla
2. 在fla中新建一个元件,库面板中右键选择“链接”,类名设置为MyCircle
3. 新建一as文件,命名为MyCircle.as(空类),代码如下

1
2
3
4
5
package{
	import flash.display.*;
	public class MyCircle extends Sprite{
	}
}

4. Lib.fla的文档类处写LibTest,然后新建一LibTest.as,代码如下

1
2
3
4
5
6
7
8
9
package{
	import flash.display.*;
	public class LibTest extends Sprite{
		public var CircleClass:Class = MyCircle;
		public function echo(string:String){
			trace("echo from lib:" + string);
		}
	}
}

5. shift + f12 导出Lib.swf
6. 新建一app.fla,文档类设置为AppTest
7. 新建AppTest.as,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package{
	import flash.display.*;
	import flash.net.*;
	import flash.events.*;
 
	public class AppTest extends Sprite{
		public function AppTest (){
			init();
		}
 
		public function init():void{
			var loader:Loader = new Loader();
			var req:URLRequest = new URLRequest();
			req.url = "Lib.swf";
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
			loader.load(req);
		}
 
		public function completeHandler(event:Event):void{
			var loader:Loader = (event.target as LoaderInfo).loader;
			var lib:LibTest = LibTest(loader.content);
			trace(lib);
			lib.echo("xxx");
			addChild(new lib.CircleClass());
		}
	}
}

8. 导出运行一下,可以看到Lib.swf被加载以后,AppTest调用lib中的MyCircle类新建了一个圆形加载了舞台上。

这种方法可以用来动态加载字体,或其他比较大但不是必须的资源。
注意这种方法和flash 本身所的runtime sharelib应该是不一样的,flash的这个概念是可以将原件按share lib导出,然后再fla中可以导入swf得到swf中的库元件,这个运行时是指flash开发工具的运行时而不是swf的运行时。

下载本文源代码:sharelib

Powered by WordPress. Theme: Motion by 85ideas.