五、Flash Media Server3.5实现音频流式处理

此文是Flash Media Server3.5初学者教程的第五篇。这一部分告诉你如何通过FMS3.5对音频进行流处理。首先我将带你总体认知一下Flash Media Server的音频流处理能力。然后通过一些应用程序例子告诉你如何流处理音频以及如何控制它,通过新的FLVPlackback2.5组件和ActionScript3.0两种方式(此后的文章将会更深入研究通过ActionScript流处理视频)。

截止目前为止,你已经处理流媒体视频文件。然而,有时候某些人会要求你通过Flash Media Server3.5传输音频。

关于音频和FMS3.5,你首先需要了解这是和使用ActionScript3.0处理音频完全不同的游戏。ActionScript包含了一些声音类来管理音频。在FMS3.5中,那些类则扮演了次要的角色。理由很简单:文件正被加入流中,因此ActionScript3.0 中的"attachAudio"方法无论出于任何目的都被认为是无用的。

Flash Media Server3.5能够流处理三种音频格式:NEllymoser,mp3和ACC。在这个教程中,你真的不会用到Nellymoser,它更多的代表语音。ACC是新生物。这种格式有一些新的特性,好消息是Adobe Flash支持AAC+,HE-AAC,AAC v1和AAC v2.坏消息是ACC内容只能在Adobe Flash Player9.0.115或更高版本中播放。(这是有道理的,因为这是伴随着Flash Player更新所推出的H.264播放)。

注意:为了获得AAC格式的概要认识,请阅读我的Adobe Developer Connection同事Fabio Sonnati博文:HE-AAC v2: A quick technical overview.

现在已经知道了可以用什么,接下来告诉你如何使用它。

FLVPLAYBACK组件与流式音频

最近我开始使用一个苹果的笔记本电脑以及美洲豹操作系统,我又安装了微软的Vista操作系统。问题是每当我启动Vista的时候,我禁不住要思考“这是错误的,我正使用苹果电脑呢”无论我什么时候通过FLVPlayback组件流式处理音频时我就会获得同样的感觉。通过一个我用来播放视频的组件播放音频需要做出很大的适应。

通过FLVPlackback组件做基本的音频流

开始之前:

1.下载本文所用的文件http://download.macromedia.com/pub/developer/beginner_audio_fms3.zip。解压已下载的案例文件,打开Exercise文件夹,复制AndreHprofile.mp3文件到C:\Program Files\Adobe\Flash Media Server 3.5\applications\vod\media文件中。

2.打开一个新的Flash cs4 ActionScript3.0文档。

3.选择窗口>组件打开组件面板。

4.拖动一个FLVPlayback2.5组件副本到舞台上。

5.选中舞台上的组件,打开组件检查器单击参数选项卡了解FLVPlayback组件的相关参数信息。

6.双击skin参数。选择皮肤对话框打开后,选择SkinUnderPlay.swf。

7.双击source参数输入rtmp://localhost/vod/mp3:AndreHprofile(见图1)

单击ok后出现一个进度条指示组件正在读取音频文件的元信息。这里的关键仍然是媒体类型。注意它是mp3。如果你不在路径中添加mp3的话,音频文件是不会播放的。

图1.通过FLVPlayback2.5组件流处理音频

8.保存并测试影片。音频开始播放,同时可以通过点击相应的按钮打开和关闭音频播放。

很明显这里有两个不好的地方。首先有很大一块用来播放视频的空白区域。第二点就是皮肤似乎仅仅是摆设。这意味着添加皮肤可能并不是一个好的想法;本来可以得到更好应用的舞台控件全被FLVPlayback组件用完了。

注意:在运行的时候你可以用一张图画去填充FLVPlayback屏幕。我很乐意告诉你如何做,但这超出了本文的讲授范围。

因此,假设音频会在后台播放,而并不需要打开或关闭它。

9,移动元件到剪贴板(见图2),选中组件后设置skin参数为None。

10.测试影片。视频文件依旧播放。

图2。使用组件播放背景音频

通过FLVPlayback组件控制音频流

在先前的例子中音频可以播放。问题是这并不能被认定为工业最佳产品。用户应当可以控制音频的播放和关闭。

具体步骤如下:

1.打开下载的案例文件Component3.fla,可以看到已经在剪贴板中添加了FLVPlayback组件副本以及加入了一些文字。

2.选择Audio图层打开组件面板。

3.打开Video组件列表拖动一个MuteButton组件到舞台上(见图3)。

图3.通过MuteButton组件控制音频

4.选择舞台上的FLVPlayback组件,设置其source参数为rtmp://localhost/vod/mp3:AndreHprofile

5.保存并测试影片。点击Mute按钮时,播放/关闭音频。

现在你已经知道了如何使用组件,接下来我会告诉i如何通过ActionScript3.0完成相同的工作。

ActionScript3.0 与流式音频

如果你已经接触Flash有一段时间,你就会知道使用FLVPlayback组件会增加SWF文件大小。FLVPlayback2.5组件也不例外。例如,上一个练习产生的文件大小在62kb左右。要想完成相同的任务而文件大小仅仅2kb该怎么办呢?ActionScript就可以做到。

正如我在开始提起的那样,当使用Flash Media Server传输音频文件时需要用不同的思维方式。你正在流传输音频而不是播放它。很好的区别这一点对于你的理解是至关重要的。这里不会用到声音对象。

流传输一个音频文件

开始之前,打开已下载的文件夹复制AudioTest文件夹到 C:\Program Files\Adobe\Flash Media Server 3.5\applications。打开AudioTest后,就会发现在整个系列教程中用到的main.asc和4个音频文件在_definst_文件夹里。

打开已下载文件夹里的DevCenterApp.fla文件。正如图4所示,已经在舞台上添加了两个按钮和一些文字。唯一要做的就是用ActionSript让它运转起来。

图4.两个按钮和一些文字;ActionScript变魔术

选择Actions图层的第一帧按下F9(windows)或Option+F9(Mac)打开动作面板,在脚本窗格中输入如下代码:

var nc:NetConnection = new NetConnection();
var ns:NetStream;
nc.connect("rtmp://localhost/AudioTest");
nc.addEventListener(NetStatusEvent.NET_STATUS,
netStatusHandler);

function netStatusHandler(evt:NetStatusEvent):void{
if (evt.info.code == "NetConnection.Connect.Success"
){
playNetStream();
}
};

function playNetStream():void{
ns = new NetStream(nc);
ns.play("mp3:AndreHprofile");
};

pauseBTN.addEventListener(MouseEvent.CLICK,pauseIt);

function pauseIt(evt:MouseEvent):void{
ns.pause();
};

playBTN.addEventListener(MouseEvent.CLICK,playIt);

function playIt(evt:MouseEvent):void{
ns.resume();
};
 
我会带领你完成此代码,以便你明白是怎么回事。
前两行创建了NetConnection和一个用来加载音频到FLash Player的NetStream变量(ns)。采用这一变量
而不是NetStream对象的原因就是在开始播放文件之前需要确保建立了一个真实的连接到Flash Media
Server。下一行创建到你复制到applications文件夹的VideoTest应用程序的连接。
注意:如果你使用的不是一个应用程序而是vod文件夹,那么这一行就要写成:

nc.connect("rtmp://localhost/vod");

代码块的最后一行告诉Flash收听NetConnection并监听一个名叫NET_STATUS的NetStatusEvent,一旦间听到
就执行netStatusHandler函数。
对于流新手而言,需要知道一旦Flash Media Server和Flash Player之间建立了连接,它们就开始相互交谈
。交谈采用特定的形式-其中之一就是你在特定情况下监听什么。所有的监听者都是在交谈开始后立即开始
监听。
下一个代码块是netStatusHandelr函数。条件语句精确地告诉Flash监听什么(NetConnection.ConnectSuccess)
以及一旦监听到就执行playNetStream()函数。
下一个代码块是音频如何播放。使用nc NetConnection创建一个NetStream对象。NetStream然后使用play()
方法播放音频。
剩下的两个函数使用NetStream类的pause()和resume()方法关闭音频以及重新开始播放。
保存并测试文件。

从多个音频文件中选择

现在你已经知道如何播放一个文件,我将会告诉你如何从多个音频文件中选择。
我的女婿,Phil Darling是多伦多一个非常流行的乐队里的贝司手和Tin Bangs的创始人。这个乐队发布了
一个包含三首歌曲的密纹唱片,它们想把这些歌曲通过流方式传输出去以便让歌迷能够听到。(非常感谢
Phil 和乐队的其他成员允许我在这个例子中使用这些文件)。
这意味着你的流应用程序的使用者应当可以从三首歌曲中进行选择。我选择使用ComboBox,这样一个弹出的
可用音乐菜单不会对界面产生多大的干扰。
注意:这个文件使用ListBox组件一样可以很容易的完成。我将会采用硬编码的方式将音乐导入项目中。如果
你觉得这种方式古怪的话,可以采用XM作为listBox和ComboBox组件的数据源。由于篇幅有限,我不会采用这种
方法。
打开TinBangs.fla文件,就会我已经为你构建好了界面。如果打开库(见图5)就会看到ComboBox组件和背景
图片。你将要做的事使用ActionScript3.0将组件添加到舞台上并将音频文件以流方式传出去。
注意:练习用到的音频文件在之前安装的文件夹AudioTest下找到。如果你跳过了这部分练习,那么复制
AudioTest文件夹到C:\Program Files\Adobe\Flash Media Server 3.5\applications.

图5.少量的ActionScript激活这个项目


选择actions图层的第一帧按f9打开动作面板。动作面板打开后会发现我已经写好了将ComboBox拉出库,
格式化并放置到舞台上的代码。关键代码在第5行,创建一个名为songs的数组。
ComboBox组件使用一个值对:label和data,label是ComboBox在舞台上呈现给用户的,data是使项目中
事情发生的字符。data字符是AudioTest文件夹中的歌曲名字不带扩展名。数组的第一项Select a song
标签不带数据;起到告诉用户做什么的作用。运行的时候单击它就会打开ComboBox了。
下一个代码块创建了一个名为songsCB的ComboBox对象,设置它的参数和舞台上的位置,告诉从哪里获取数据
以及最终通过addChild方法放置到舞台上。
下一个代码块通过为文字设置字体、字体颜色、大小和样式来修饰ComboBox的内容。
用户已经可以选择歌曲了,接下来我将告诉你当ComboBox中列举的歌曲被选中时如何播放它。
向下滚动到代码的28行输入如下代码:

songsCB.addEventListener(Event.CHANGE, playTune);
var nc:NetConnection = new NetConnection();
var ns:NetStream;
nc.connect("rtmp://localhost/AudioTest");
nc.addEventListener(NetStatusEvent.NET_STATUS,
netStatusHandler);

代码开始于创建一个监听ComboBox的CHANGE事件的事件监听器。当用户点击一个歌曲标题时就会产生一个事件。
一旦FLash监听到就会执行playTune函数。
按回车键两次输入如下代码块:

function netStatusHandler(evt:NetStatusEvent):void {
if (evt.info.code == "NetConnection.Connect.Success"
) {
ns = new NetStream(nc);
// trace("Congratulations. You are connected.");
}
};
这属于家务管理的领域,切忌,ns永远不会被连接 因为一个NetConnection从来没有确立NetStream。
此代码是你告诉Flash如何等待直到获得一个成功的连接。
伴随着这种家务管理的方式,你可以添加功能。
注意:trace注释语句用于本地测试目的。最终把文件上传到FMS服务器的时候删除或保留此语句都可以。
按两次回车键添加如下代码:
function stopMusic():void {
  ns.close();
};
 
function playTune(evt:Event):void {
  ns.close();
  if (ComboBox (evt.target).selectedItem.data !="") {
    stopMusic();
    ns.play("mp3:"+ComboBox(evt.target).selectedItem.data);
  }
};
 
第一个函数stopMusic()完成如何管理一首歌曲的功能。仅仅简单使用NetStream的close()方法关闭
流。最后的函数playTune完成如何播放歌曲的功能。通过使用close()方法关闭所有可能正在播放的歌曲。
 
条件语句处理ComboBox中哪一项被选中。首先做的是询问是否有数据和选中的项目关联。如果没有,就不会
发生什么。因此可以使用ComboBox的第一项关闭正在播放的歌曲,因为没有数据和第一项关联。在这种情况下,
单击此处意味着函数简单返回到上一行。
 
如果有数据关联的话,stopMusic()函数被执行。如果删去stopMusic()此行代码当你选择一首不同的歌曲就
会有两首交替播放的歌曲。(根据Martha Stewart的说法,这不是什么好东西)。
 
在关闭当前歌曲之后,代码的最后一行将第五行的数据中的数据传入到ns.play()方法中。
因此,如果选中第一首歌曲,方法将会是:
ns.play("mp3: WhiteLies(Timekiller)");
检测代码,如果一切正确保存并测试项目。单击ComboBox(见图6)中的一项,歌曲就会播放。

图6.最终的项目

接下来

我希望你明白Flash Media Server3.5除了简单的播放视频外还可以做很多。它同样可以播放音频。正如

你所看到的,你可以采用多种方法播放一首歌曲以及整个歌曲列表。由于使用的是FMS3.5所以音频文件不会

进入浏览器的缓冲区,这是最好的一点。

如果你真的希望创建或控制自己的音频文件的话,最好的起点是使用Adobe Soundbooth CS4,它逐渐被

认为是Flash的音频编辑器。SoundBooth帮助支持中心提供了一些指引你在相对短的时间内掌握此程序的

教程。

如果你正寻求一些工业强度的音频工作,Adobe Audition3适合你。你可以下载一个测试版然后购买。

此系列教程的下一篇将深入研究使用ActionScript3.0流式传输实时视频。

posted @ 2009-05-15 16:16  Andy  阅读(1022)  评论(0编辑  收藏  举报