Macromedia Flash Professional 8 和 Adobe Flex Builder 2 都支持直接在Flash video (FLV)文件中使用提示点。使用Flash 8(ActionScript 2.0),完成这工作只需要一个FLVPlayback组件的实例和简单的设置。可以在组件检查面板中定义或者调用FLVPlayback.addAsCuePoint()方法;使用Flex Builder 2,需要的是对应VideoDisplay实例指定的CuePointManager类的实例。两种情况下,接下来都是设置一个cuePoint事件的监听器对象和定义该对象一个特定的响应函数。
而对音频文件,实现提示点要困难些。虽然使用Flash8能用如MediaController, MediaDisplay, 或MediaPlayback这些媒体组件来装载MP3文件,但是要注意这些组件是为了兼容Flash Player 6 and 7。这些组件的结构比FLVPlayback旧,这样,使用它们会使生成的swf文件多出至少55KB。使用FLVPlayback仅使之增加33KB,可是它不能装载MP3文件。类似的,Flex Builder 2的VideoDisplay类只能装载video。可以暂且做几个只有声音的FLV文件(不包含视频内容)。不过,这看来并不广泛适用。特别在一个团队中,你并不能决定选择哪些外部资源。而最通常的音频格式是MP3。幸运的是,用一点ActionScript就可以弥补这个不足了。
这篇文章将讲述一个特别解决方案的两个版本:用一个自定义类SoundSync来支持内部声音资源或者是外部的MP3文件。代码有ActionScript 2.0(Flash Professional 8 )和ActionScript 2.0(Flex Builder 2)两种。
不管使用那种语言,方法是一样的。ActionScript 2.0和ActionScript 3.0 都提供了Sound类来代表嵌入或装载的声音文件。两种语言都允许播放,从开头播放或从音频的某个时刻播放,暂停,循环。我们当然想不重造轮子!那些已经有的功能都是有用的。缺少的只是对提示点的支持,所以看来应该保留原有功能而extend这个Sound类。
自定义类SoundSync要继承Sound并添加下面的新公有方法:
addCuePoint(): 添加一个提示点
getCuePoint(): 通过提示点的名字或者时间返回该提示点
removeCuePoint(): 通过提示点的名字或者时间删除该提示点
removeAllCuePoints(): 删除所有的提示点
此外,还添加了几个私有方法。并根据使用语言不同重写一些原有的方法。简而言之,SoundSync类使用一个timer不断对照当前的播放时间检查当前提示点对象的time属性。我们先从ActionScript 2.0开始再移植到ActionScript 3.0。
需要环境
为了充分学习,需要如下软件和文件:
Flash Professional 8
Flex Builder 2
In Labs: Flash Professional 9 ActionScript 3.0 Preview (可选)
示例文件
sound_sync.zip (ZIP, 3MB)
准备知识
对ActionScript 2.0的中等掌握和对Flex Builder 2及ActionScript 3.0的介绍性了解。
ActionScript 2.0版的SoundSync类
自定义类必须保存到一个外部文本文件中,命名为SoundSync.as。按照最佳实践,应该把这个文件放在符合包结构的路径下的文件夹中。这里,应该放到相对于全局classpath设置的(选择Edit > Preferences > ActionScript category > ActionScript 2.0 Settings 按钮,中文的按钮……我不是中文版)路径为net/quip/sound这个文件夹下。为了方便按照我的域名给包起名为net.quip.sound。请随便把它改成你喜欢的吧。有关包的细节,请参考Flash8帮助文档中”……我又不是中文版–b”节。
创建ActionScript 2.0 类文件
启动Flash Professional 8,选择File > New > ActionScript File 图一
---
|图1 |
| |
---
输入如下的ActionScript代码:
/**************代码*1***********/
import mx.events.EventDispatcher;
import mx.utils.Delegate;
class net.quip.sound.SoundSync extends Sound {
// PROPERTIES 属性
// CONSTRUCTOR 构造
// METHODS 方法
// EVENT HANDLERS 事件处理
}
头两行import了两个类,后面的代码会用到他们。在ActionScript 2.0中,import语句可以方便以后输入类名的时候不必再输入其完整的包名。
接下来,是声明这个类继承自基类Sound。然后写上属性,构造函数,方法和事件的注释占个位置。对一个类的代码,这些不是必须的,但是他们使类的结构一目了然。下面把细节添上。 |