Adobe flash media server 开发者向导(二)
2.流服务
2.1使用实况服务
2.1.1关于实况服务
实况服务就是在flash media server上创建一个发布点。你可以使用Flash media encoder来捕捉,编码并且向实况服务流式实况发布视频,并且可以在范例客户端或FLVPlayback组建里面播放视频。你也可以建立你自己的应用程序来捕捉视频,你自己的客户端应用程序来播放视频。
下列的实况视频资源可以向实况服务发布视频:
Flash Media Encoder 2.0
注释:只有Flash Media Interactive Server和 Flash Media Development Server 支持Flash Media Encoder 的附加。
Flash Media Interactive Server and Flash Media Development Server(查看从服务器到服务器的发布)
一个定制的Flash Player应用程序用来录制音频和视频
2.1.2测试实况服务
1.在电脑上连接一个摄像头。
2.打开Flash Media Encoder点击开始。默认的Flash Media Encoder会向同一台电脑的默认实况发布点发布流,rtmp://localhost/live,发布的流的名字是livestream。
3.双击RootInstall/samples/applications/live/livetest.html文件在浏览器里打开客户端应用程序来观看实况流
要使用FLVPlayback组建作为客户端,设置连接路径的参数为发布点和流的名字的URL:(rtmp//localhost/live/livestream,默认)。并且将isLive参数设置为true。
2.1.3修改实况服务
1,复制RootInstall/applications/live文件夹并给它一个新的名字,例如live2.在这个例子中,新的实况服务在RootInstall/applications/live2路径下
你可以按照需要创建很多实况服务的实例。
2.打开fms.ini文件(在RootInstall/conf目录下)添加一个新的条目来设置新服务的路径,例如LIVE2_DIR = C:"Program Files"Adobe"Flash Media Server 3"applications"live2.
3.打开RootInstall/applications/live2 目录下的Application.xml文件改变虚拟路径条目为:<Streams>/;${LIVE2_DIR}</Streams>.
4,重启Flash media server
5.客户端可以用rtmp://flashmediaserver/live2/streamname这个URL来连接到发布点。如果客户端是FLVPlayback组建,设置连接路径参数为发布点的URL加上流的名字,设置isLive参数为true.
2.1.4取消实况服务
将所有的实况服务文件夹移动到application文件夹外面。
2.2使用视屏点播服务
2.2.1关于视频点播服务
视频点播服务(video on demand)服务让你不要创建任何的应用程序或配饰服务器就能流式的播放录好的视频。你可以使用Flash CS3和flash8的FLVPlayback组建做客户端。将Mp4,FLV和MP3文件复制到vod application的媒体文件下就可以向客户端传播流了。
2.2.2测试视频点播服务
1.做下列事情之一:
双击RootInstall/samples/applications/vod/vodtest.swf文件在一个单机的flash player打开一个客户端
双击RootInstall/samples/applications/vod/vodtest.html文件在浏览器里面打开一个客户端。
2.点击go.
3(可选)要播放其他版本的范例文件,从pop-up菜单里面选择文件然后点击go。
2.2.3修改视频点播服务
1,复制RootInstall/applications/vod文件夹并给它一个新的名字,例如vod2.在这个例子中,新的视频点播服务在RootInstall/applications/vod2路径下
你可以按照需要创建很多实况服务的实例。
2.打开fms.ini文件(在RootInstall/conf目录下)添加一个新的条目来设置新服务的路径,例如VOD2_DIR = C:"Program Files"Adobe"Flash Media Server 3"applications"vod2.
3.打开RootInstall/applications/vod2 目录下的Application.xml文件改变虚拟路径条目为:<Streams>/;${VOD2_DIR}</Streams>.
4,重启Flash media server
5.将编码好的媒体文件放到你在fms.ini里面定义好的文件夹下(在这个例子里面就是C:"Program Files"Adobe"Flash Media Server 3"applications"vod2"media)。媒体文件现在可以通过rtmp://flashmediaserver/vod2/filename这个URL得到。
注释:你不需要详细说明这个URL的子文件夹;meida目录已经在fms.ini文件里面被你设置了。
2.2.4取消视频点播服务
将所有的视频点播服务文件夹移动到application文件夹外面。
2.3为流服务创建客户端
2.3.1创建一个客户端应用程序
以提供的范例客户端代码为例(RootInstall/samples/applications/live and RootInstall/samples/applications/vod),按照需要而修改它。
客户端的视频点播和实况服务可以使用出了相面两个以外的所有flash player的特性
录制实况流(NetStream.publish("streamName", "record")).
远程调用shared objects(SharedObject.getRemote()).
2.3.2使用FLVPlayback组件
你可以使用flash 8和flash cs3里面的FLVPlayback组件当作视频点播和实况服务的客户端。将连接路径参数设置成流的URL,如果式连接到实况服务的话设置isLive参数为true.
2.3.3连接到一个流服务
流服务希望写入的URI是一下的格式rtmp://hostName/serviceName/instanceName/[formatType:]fileOrStreamName。
hostName:是Flash Media Server的域名。
serviceName:或者是vod或者是live。
InstanceName:如果客户度连接到默认的实例,你可以或者选择或者忽略实例的名字或者使用_definst_.如果客户端连接到一个你已经创建的一个实例,比如room1,就使用那个名字。
formatType:是一种支持的格式flv:, mp3: or mp4:. 如果没有特别标注的话默认的格式是 flv:.
fileOrStreamName:或者是一个文件名(例如my_video.mp4),或者是一个路径名(例如subdir/subdir2/my_video.mp4)。如果文件是FLV或MP3万恶渐渐的话,你不要特别标注文件格式,如果是一个Mp4文件,你必须标注格式,例如rtmp://www.examplemediaserver.com/vod/ClassicFilms/mp4:AnOldMovie.mp4.
2.3.4允许从特别制定的域的连接
默认的,客户端可以从任何地方连接到实况和视频点播服务。要限制连接客户端的域,编辑服务的application文件夹下的文本文件
找到the RootInstall/applications/live 或RootInstall/applications/vod folder做下列事情之一
要为SWF客户端添加一个域,编辑allowedSWFdomains.txt文件
要为HTML客户端添加一个域,编辑allowedHTMLdomains.txt文件。
这些TXT文件抱恨了添加域的细节信息。
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。