(转)Adobe flash media server 开发者向导三 -- 开发媒体应用程序
Adobe flash media server 开发者向导(二)
By:闪闪威廉@nju
3.开发媒体应用程序
Adobe® Flash® Media Interactive Server的视频应用程序可以是视屏点播或者是实况视频的应用程序。视屏点播应用程序是从服务器发送编码完的视频流,比如电视节目,商业或个人录制的存储在服务器上是视频。一个组织可能有大量的视频档案或最近正在拍摄视频。视频可以是短的片段(0-30秒),长片段(30秒到5分钟),或非常长的片段(5分钟到小时级别的长度)。
实况视频应用程序将视屏从服务器流式的发给用户或从用户发送给服务器然后再到其他用户。实况视频是一个实况事件的典型应用,像公司会议,教育,体育事件和音乐会或者持续的发送,被电视台和电台使用。你可以使用可以从Adobe.com上得到的Adobe Flash Media Encoder来编码和流传播实况视频。
3.1连接到服务器
3.1.1NetConnection类
在一个客户端可从flash media server播放音频和视频之前,它必须连到服务器。连接的需求会被服务器的应用程序的实例接受或拒绝,连接消息会被发送回客户端。一个应用程序接受连接请求,一个在客户端和服务器端可用的连接就产生了。
NetConnection类连接客户端到以个服务器的应用程序的实例。在最简单的例子里面,你可以通过创建一个NetConnection对象的实例然后用应用程序实例的URI来调用connect()方法:
var nc:NetConnection = new NetConnection();
nc.connect("rtmp://localhost/HelloServer");
流处理网络连接上音频,视频和数据的流动。一个NetCOnnection对象就像一个从客户端到服务器,或从服务器到客户端的传输音频,视频和数据流的管道。一旦你创建了NetConnection对象,你可以在上面附加一个或多个流。
一个流可以承载不止一种类型的连接(音频,视频和数据)。然而,一个流只流向一个方向,从服务器到客户端或从客户端到服务器。
许多流可以使用服务器和客户端之间的NetConnection对象
A. Flash Media Server B. 单个数据流 C. NetConnection D. Flash Player, AIR, or Flash Lite 3客户端。
3.1.2应用程序的URI
连接到应用程序的URI可以是相对路径或绝对路径,有以下语法(括弧里面的是可选的):
protocol:[//host][:port]/appname/[instanceName]
组成部分 |
举例 |
描述 |
protocol: |
rtmp: |
协议是用来连接到Adobe Flash Media Server, 全城就是 Adobe Real-Time Messaging Protocol. 可能的值为 are rtmp, rtmpe, rtmps, rtmpt, and rtmpte. 要看跟多信息,查看技术前言 |
//host |
//www.example.com //localhost |
本地或远程计算机的主机名. 连接到一个作为服务器和客户端的同一台电脑, 使用 //localhost 或者忽略 //host 标识符。 |
:port |
:1935 |
连接到 Adobe Flash Media Server的端口号,如果协议是 rtmp, 默认的端口号是 1935 你不需要制定特殊的端口号 |
/appname/ |
/sudoku/ |
当你的应用程序配置完成后RootInstall/applications的子目录的名字。你可以在fms.ini(在 RootInstall/conf/fms.ini).配置文件里面为你的应用程序的目录指定其他位置 。 |
instanceName |
room1 |
客户端连接的应用程序的实例,比如,一个聊天室的应用程序会有许多聊天的房间:chatroom/room1, chatroom/room2,等等 如果你不指定一个实例的名字,客户端就连接默认的实例,名叫_definst_. |
URI里面唯一需要的部分是protocol 和application name,如下所示
rtmp://www.example.com/sudoku/
在下面的例子里面,客户端是作为服务器的同一台电脑,这是在你开发和测试应用程序时很常见的:
rtmp:/sudoku/room1
3.1.3helloserver应用程序
你可以在安装的根目录下的documentation/samples/HelloServer目录下找到HelloServer应用程序。这个简单的Flash应用程序显示两个按钮,可以让你创建和关闭与服务器的连接。输出窗口显示了连接状态的信息。
运行应用程序
最简单的运行这个范例的方法时将它安装到作为服务器的同一台电脑上。
1.在flash media server的安装根目录的documentation/samples 目录下复制HelloServer文件夹。
2.在服务器的application文件夹RootInstall/applications/HelloServer下创建一个文件夹来注册应用程序。
3.(可选)要想在一个不同的电脑上运行sample,打开HelloServer.as文件,编辑下面的行,把你自己服务器的URL加进去
nc.connect("rtmp://localhost/HelloServer");
要知道如何构造一个URL查看《连接到服务器》。
设计Flash用户界面
范例已经建号并且包括在一个ZIP文件里面,然而,这些说明告诉你怎么重创建它这样你就可以建造你自己的并且向里面添加东西。
1.在Adobe Flash CS3 Professional里面,选择文件 > 新建 > Flash文件 (ActionScript 3.0), 点击Ok.
2.选择窗口>组件打开组建面板。
3.点击按钮组件并将它拖到舞台。
4.在属性查看器中,点击属性条目。选择MovieClip作为实例行为,并且将实例的名称里面填入connectBtn。
5点击参数条目,然后选则Label,将按钮的Label设置为Connect。
6.拖动第二个按钮组件到舞台。
7.将第二个按钮的实例名称设置为closeBtn,Label为Close。
8.保存FLA文件,命名为HelloServer.fla。
创建客户端脚本
你可以在Flash Media server的安装根目录下的documentation/samples/HelloServer目录里找到完整的Actionscript范例,名为HelloServer.as。当你开发Actionscript3.0的代码。查看ActionScript 3.0语言和组件参考。
1.在Adobe Flash CS3 Professional里面选择文件>新建>Actionscript文件,然后点击OK。
2.以大写字母开头并且以.as为扩展名来命名和保存这个ActionScript文件。比如HelloServer.as。
3.返回到FLA文件,选择文件>发布设置。点击flash条目然后设置。
4.在文档类的框框里面,输入HelloServer。点击绿色的检查标记来去确保类文件存在。
5.点击OK,然后再点击OK。
6.再ActionScript文件里面声明包。如果在FLA的同一目录下保存的actionscript文件,不要使用包名,例如:
package {
}
然而如果你在FLA文件的目录的子目录下保存了as文件,包名必须匹配你的Actionscript文件的目录,例如:
package samples {
}
7.在包里面,导入你需要的类:
import flash.display.MovieClip;
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
8.在导入语句后,创建类的声明。在类里面定义NetConnection类型的变量:
public class HelloServer extends MovieClip {
private var nc:NetConnection;
}
确保类是扩展了MovieClip类的(貌似Sprite类更好)
9编写构造函数,为每个按钮注册事件侦听。
public function HelloServer() {
// 为两个按钮注册mouse clicks事件侦听
connectBtn.addEventListener(MouseEvent.CLICK, connectHandler);
closeBtn.addEventListener(MouseEvent.CLICK, closeHandler);
}
使用addEventListener() 来调用一个名叫connectHandler()事件处理函数,处理当Connect按钮被点击时的事件。同样的,当Close按钮被点击时调用closeHandler()。
10.编写connectHandler()函数,当用户点击Connect按钮时通过这个函数来连接到服务器:
public function connectHandler(event:MouseEvent):void {
trace("Okay, let's connect now");
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
nc.connect("rtmp://localhost/HelloServer");
}
在connectHandler()中,添加了一个NetConnection对象的netStatus事件的事件侦听。然后通过调用NetConnection.connect()和使用正确的URI连接到服务器上的应用程序的实例。这个URI连接到一个名叫HelloServer的应用程序实例,它就在这台既作为服务器又作为客户端的电脑上。
11.编写closeHandler()函数来定义当用户点击Close按钮时的行为。
public function closeHandler(event:MouseEvent):void {
trace("Now we're disconnecting");
nc.close();
}
这是明确的调用Close()来关闭和服务器端的连接的最好的实践。
12.编写netStatusHandler()函数来处理NetConnection对象返回的netStatus对象。
public function netStatusHandler(event:NetStatusEvent):void {
trace("connected is: " + nc.connected);
trace("event.info.level: " + event.info.level);
trace("event.info.code: " + event.info.code);
switch (event.info.code)
{
case "NetConnection.Connect.Success":
trace("Congratulations! you're connected" + "\n");
break;
case "NetConnection.Connect.Rejected":
trace ("Oops! the connection was rejected" + "\n");
break;
case "NetConnection.Connect.Closed":
trace("Thanks! the connection has been closed" + "\n");
break;
}
}
一个netStatus对象包含了一个info对象,info对象包含了表述连接状态的level和 code。
3.1.3.1理解连接消息
当你运行范例,点击了Connect按钮时,一旦连接成功,你会看到这样的消息:
Okay, let's connect now
connected is: true
event.info.level: status
event.info.code: NetConnection.Connect.Success
Congratulations! you'r e connected
Connected行是:true显示了NetConnection.connected属性的值,意味这Flash Player是否通过TRMP协议连接到了服务器。下面两行描述了netStatus事件,NetConnection对象发送和报告了它的连接状态:、
event.info.level: status
event.info.code: NetConnection.Connect.Success
level属性有两个值:status或error。code属性描述了连接的状态。你可以在你的netStatusHandler函数里面检查不同的code的值,并相应的做出响应。在你创建流或在你的应用程序里面做其他事情前都要检查确保连接成功。
同样的,当你点击关闭按钮时,你可以看到下面的信息:
Now we're disconnecting
connected is: false
event.info.level: status
event.info.code: NetConnection.Connect.Closed
Thanks! the connection has been closed。