12 December 2005
熟悉将 Flash Media Server 应用程序结合在一起的基础知识。如果您还不熟悉, 建议您阅读:
了解 ActionScript 2.0 类结构或基本的面向对象编程。如果还不了解, 建议您阅读:
高级
Flash Media Server 2 提供了传统流式媒体能力和灵活开发环境的独特组合, 用于创建并向观众交付媒体体验。这些组合包括传统的媒体, 如按需点播视频, 实时 Web 事件广播, MP3 流以及丰富媒体通信应用程序, 如视频博客、视频消息、多媒体聊天环境。
Flash Media Server 2 的一个新功能是文件对象功能, 它支持对服务器上已定义的沙箱进行实时读/写文件访问, 无需使用 Flash Remoting 即可支持内容管理系统和数据库应用程序。这是一个您可以扩展以和文件对象应用程序一起使用的简单示例。
在本文中, 您将学习相当简单的应用程序, 该应用程序能够您用使用 Flash Professional 8 构建的预定义组件按要求显示 FLV 和 MP3。该应用程序从您服务器上的特定位置自动获取 FLV 和 MP3, 但也可以扩展用于其他用途。例如, 要使用 JPEG 为相册自定义此应用程序, 您只需重新定义过滤器以使其调用 JPEG。
此应用程序示范了服务器端上的新“文件对象”属性, 它与客户端上的 DataGrid、FLVPlayback 和 MediaPlayback 协同工作。它显示了 XML 驱动的播放列表的一个替代方法。如果您想了解有关 XML FLV 列表的详细信息, 请查看 Lisa Larson 的文章, 为流式视频创建动态播放列表。
要全部执行此代码, 您需要 on_demand_player.zip, 它是本文随附的示例文件下载。此处是您应该对 ZIP 压缩档的内容执行的操作:
很容易更改您的默认应用程序文件夹。打开文本编辑器中的 conf/fms.ini, 并更改变量 VHOST.APPSDIR。
Flash Media Server 2 有两个控制逻辑、FileObj 和 MyCollection 的应用程序 (请参见图 1)。当举例说明 OnDemandPlayer.swf 时, 它会访问 FileObj, 将内容返回到 DataGrid。当用户单击 DataGrid 中的对象时, 它会调用 MyCollection 中的视频。
要使此应用程序正常工作, 您需要配置“文件访问”和“流访问”。
该 File Object 类允许访问服务器文件系统中的沙箱。为了防止任何误用, Flash Media Server 允许在为应用程序实例运行的虚拟主机指定的沙箱中访问文件。
要定义服务器端沙箱, 请进入 FileObj 文件夹中的应用程序 .xml 文件。定义您希望服务器查找的存储 FLV 和 MP3 的位置:
<FileObject>
<VirtualDirectory>/approot; C:\Program Files\Macromedia\Flash Media Server 2\applications\MyCollection\streams\_definst_\
</VirtualDirectory>
</FileObject>
您刚刚使安全文件能够访问这一定义的沙箱。您可以通过连续添加虚拟目录设置多个文件对象目录。
还需要设置 Vhost.xml, 您可以在 Flash Media Server 2 文件夹的 conf/_defaultRoot_/_defaultVhost_/ 子文件夹中找到它, 因为当从 Vhost 实例中调用“/approot”时, 您必须告知服务器它应该在指定的目录中查找。您需要定义放置流的位置 (应该与您早期为 FileObject 定义的设置相同):
<VirtualDirectory>
<Streams>/approot; C:\Program Files\Macromedia\Flash Media Server 2\applications\MyCollection\streams\_definst_\
</Streams>
</Virtual Directory>
有两个在 Flash Media Server 上运行的应用程序:
二者都使用相同的默认服务器端 ActionScript 文件 main.asc 运行。
开发任何 Flash Media Server 应用程序时, 以服务器端 ActionScript 开始总是最方便的。这样做能够您使用跟踪语句调试和模拟客户端操作。这不仅缩短了开发时间, 而且避免了在以后出现令人头疼的问题。
您可能注意到了 FileObj 文件夹的 main.asc 中的其他函数。注意, 有超出该应用程序所需的更多服务器端 ActionScript。这就是我用来在熟悉的框架或 API 中处理所有文件访问命令的内容。我希望你能发现此代码非常有用, 并对其进行重新计划, 以用于将来的文件访问函数。
下面, 我们看一下该文件中的几个主要函数。
文件类的构造函数
this.myFile = new File(name);
此构造命令创建了文件类的一个实例, 作为对象 myFile。变量和名称可以是文件,也可以是目录。在此演示中, 您将把别名目录传递到此, 以收集有关它的信息 默认情况下, 为 approot 。
文件类的 File.List
var dirList = this.myFile.list(filter);
这是客户端上的 DataGrid 从其中获取信息的列表函数。该列表方法为目录中的每个文件返回一个具有一个元素的数组。您可以用过滤器函数进一步对此进行过滤:
function filter(name)
{
if ( name.lastIndexOf( ".flv") != -1 || name.lastIndexOf(".mp3") != -1){
return true;
}
return false;
}
例如, 如果您想据此构建并只显示 JPEG 图像, 就可以使用该过滤器和列表命令来控制将什么传输给您的客户端。
此处是 main.asc 文件中其他函数的简短概要, 以备您使用文件对象重新计划它们从而用于其他应用程序的需要。要查找这些函数的具体细节信息, 请阅读 Flash Media Server LiveDocs, 它提供了有关其中每个功能的详细信息。
此处是其他文件对象函数的简短概要:
在 Flash Professional 8 中用 FLVPlayback 组件进行流式处理时, 经常发生的错误之一是忘记将 main.asc 文件添加到流式 Flash Media Server 视频目录中。我已作为此包的一部分提供了该功能, 因此您不会遇到该问题。
此客户端设置相当简单, 因为它是使用基本的 OOP 原理用预存在的组件构建的。该客户端框架由位于 OnDemandPlayer 文件夹中的以下文件组成:
FLA 由三个基本控件组成:
连接这些客户端组件相当简单。我们看一下几个关键点。
对于可伸缩应用程序, 使用 OOP 原理的一个常见最佳实践是作为类附加电影剪辑 请参见图 2 。这是组织 ActionScript 类并将其附加到舞台的出色方法。Breeze 公司的架构师 Peldi将此描述为最佳实践。因此, 如果您想知道如何将 OnDemandPlayer.as 附加到 OnDemandPlayer.fla, 请查阅库。
这与使用 #include 文件相当, 但更容易管理, 因为只需从该库附加电影剪辑即可:
attachMovie("OnDemandPlayer","mc",0);
通过基本的 makeConnection 函数设置文件访问与服务器的握手:
public function makeConnection():Void {
nc = new NetConnection();
nc.connect("rtmp://"+serverName+"/"+appName);
nc.owner = this;
nc.onStatus = function(info) {
if (info.code == "NetConnection.Connect.Success") {
owner.dir();
}
};
}
这会连接到 Flash Media Server 文件夹名并发送该名称, 您可通过此名称获得 FLV 和 MP3:
nc.call("createFileObj", null, foldername);
这与 Flash Media Server 连接, 以获得 FLV 和 MP3 的长度:
var streamlength = owner.nc.call("getStreamLength", null, stream_name);
FLVPlayback 组件具有内置的流长度。要在 MediaPlayback 中设置 MP3 的长度并在 DataGrid 中显示该长度, 则必须从 FileObj main.asc 文件中获取消息。
在客户端上, 您必须收集流名称以及数组中与文件对象有关的其他信息。这是用 dirResult 函数完成的:
private function dirResult(folderName, owner):Void {
this.onResult = function(retVal) {
for (var i = 0; i<retVal.length; i++) {
var flv_name = (retVal[i].name).substr((retVal[i].name).lastIndexOf("/")+1);
var index = flv_name.lastIndexOf(".");
var stream_name = flv_name.substring(index + 1, flv_name.length) + ":" + owner.folderName + "/" + flv_name.substring(0, index);
var streamlength = owner.nc.call("getStreamLength", null, stream_name);
owner.myDP_array.addItem({Name:flv_name, Length:retVal[i].streamlength, CreationTime:retVal[i].creationTime, LastModified:retVal[i].lastModified, Size:retVal[i].length});
}
};
注意对象 retVal 不只包含流名称。它还包含 creationTime、lastModified 和长度 文件大小 。
这只是少量详细信息, 您可以使用服务端上的 List 命令收集它们。有关文件对象的完整列表, 请查看 Flash Media Server LiveDocs 中的文件类的属性概要。
使用 Flash Media Server 中的文件访问和文件对象功能是将内容显示为 XML 驱动的数据列表的简单方法。本文中给出的示例只是一个简单的用例, 其目的仅是显示您服务器上的媒体资产。对于其他应用程序, 您可能希望将 XML 的扩展性和组织、易用性与文件访问相结合, 作为用于 Flash Media Server 点播应用程序的最佳方法。借助该应用程序, 您可以轻松地将整个 Flash 视频和 MP3 媒体集锦拖到您的服务器上, 以流化您的集锦。
在学习过程中, 如果您遇到有关 Flash Media Server 开发的问题, 请检查 Chattyfig 列表。这是 Flash Media Server 开发人员的重要列表, 往往包含大量开发讨论。作为开发人员, 在遇到很难解决的问题时, 我都会在这一宝贵的资源中寻求帮助。然而, 要注意您遇到的问题, 如果问题简单, 您可以在 Google 上搜索, 找到问题的答案。
我希望这有助于您了解构建到 Flash Media Server 中的新的文件访问功能。希望您在未来使用 Flash Media Server 时能收获很多。
Tutorials & Samples |
Flash Media Server Forum |
More |
Flash Media Server Cookbook |
More |