ActionScript3.0从入门到精通第14章声音与视频流编程(教学)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第14章声音与视频流编程声音与视频都属于多媒体范畴,是开发引人入胜的交互式应用程序不可缺少的元素。ActionScript3.0既可以加载外部的声音和视频文件,也可以即时处理通过麦克风和摄像头获取到的实时的声音和图像。在程序执行过程中,还可以对声音和视频进行精确的控制。14.1处理声音ActionScript3.0允许将外部声音文件(如mp3文件)加载到SWF中,也可以在创建SWF文件时将声音信息支持嵌入其中。如果用户的计算机装有麦克风,也可以由麦克风来获取音频信息。在一些互动多媒体服务中,还可以直接访问服务器的流式声音数据。与图像文件格式一样,目前各种音频格式也是五化八门。FlashPlayer目前支持mp3格式存储的声音文件,不能直接加载或播放如WAV或AIFF格式的声音文件。以下将以具体实例来讲解处理声音时的各种常见问题。14.1.1加载外部声音文件加载外部声音文件使用Sound类。开始需先将Sound实例化,常用的语法如下。varsound:Sound=newSound();然后使用Sound类的load方法,加载指定的URLRequest实例。sound.load(newURLRequest(地址字符串));其中,“地址字符串”为声音文件所在的路径。当load声音成功后即可使用Sound类的play方法播放该声音文件。sound.play();14.1.2声音的加载进度加载声音文件的进度可以由进度事件ProgressEvent.PROGRESS侦听bytesLoaded和bytesTotal两个属性。常见的方式是求bytesLoaded和bytesTotal的比值,计算加载的百分比,如下列代码。Math.floor((e.bytesLoaded/e.bytesTotal)*100)+%;14.1.3声音的基本控制在ActionScript3.0中,一个Sound类是远远无法满足各种对声音文件控制的需要的。在Flash应用程序中,每一个声音都被分配到一个声道。SoundChannel类否则对这些声道进行控制。SoundChannel类包含stop方法可以停止该声道的播放,同时还可以监控声道的音量,以及对声道设置SoundTransform对象的属性。14.1.3声音的基本控制以下代码将声音分配到一个名为channel的声道中。varsound:Sound=newSound();//声明一个新的声道varchannel:SoundChannel;sound.load(newURLRequest(music/Beat_It.mp3));sound.addEventListener(Event.COMPLETE,playSound);functionplaySound(e:Event):void{//将sound赋予channel声道channel=sound.play();}14.1.3声音的基本控制SoundChannel类中的position属性可以返回当前播放头的位置,配合Sound类的play方法和SoundChannel类的stop方法可以实现对声音的简单控制,包括播放、停止、暂停和恢复播放。14.1.4调节音量加载后的声音可以使用SoundTransform类中的volume属性调整音量的大小。根据不同需要,既可以单独调节不同声道的音量,也可以使用全局方法,调节整个播放环境的音量。首先介绍单独调节声道音量的方法。每个SoundChannel实例都有一个soundTransform(这与每个显示对象都有一个transform属性颇为类似)。这个属性的对应值是一个SoundTransform实例,可以通过这种方法调节音量的大小。volume的允许值由0~1,当其值为0时音量最小,值为1时音量恢复为最大。设置音量的关键代码如下。声道.soundTransform=newSoundTransform(音量大小);14.1.5多个声道的调节如前所述,Sound实例可以赋予到不同的声道中,并单独进行处理。当Flash程序需要处理多个声音时,便可以使用不同的声道,加载声音,并分别进行设置。以下例子将示范当加载两个不同声音时,如何控制其音量,与用户形成交互。14.1.6声音的全局控制当使用多个声道(SoundChannel)时,ActionScript3.0允许使用SoundMixer类进行声音的全局控制。SoundMixer类提供了一些静态属性和方法,可以直接设置控制全局声场。例如,可以使用stopAll方法停止所有的声音播放,也可以设置全局的soundTransform属性(包括音量,声场平移等)。14.1.7声音的波型ActionScript3.0相较于以前版本,新增加了一个SoundMixer.computeSpectrum方法,可以读取当前播放声音的波形。这个波形是经过混音之后的波形值,当声音是由几个声道(SoundChannel)混和而成时,computeSpectrum方法输出的是混合在一起的每个SoundChannel对象组合的声音数据。由computeSpectrum读取的声音数据类型是一个ByteArray对象,它包含512个采样值。每个值都是介于-1和+1之间的浮点数,可以使用ByteArray类的readFloat方法顺序读取。这些值可以分为2组,前256个值表示左声道,后256个值则代表右声道。14.1.7声音的波型computeSpectrum是一个静态方法,其语法如下。SoundMixer.computeSpectrum(输出字节数组,傅立叶变换标志,采样率);其中,输出字节数组为经过调用computeSpectrum后被赋值的字节数组的名字。傅立叶变换标志的默认值为false,它表示输出的波形是否经过傅立叶变换,当其为true时,波形将经过傅立叶变换转换为频谱图像。采样率可以设置可以设置声音的采样频率,当其为0时,以44.1kHz进行采样;为1时以22.05kHz频率进行采样,依此类推。14.1.8声音的元数据信息Sound类提供了对声音元数据的访问功能,可以提取出mp3文件的id3元数据。很多mp3音乐都设置有用于显示文件属性的详细id3信息,例如我们经常调用的文件“BeatIt”的id3信息就包括歌曲名、演唱者、专辑、流派等,如下图所示。14.1.8声音的元数据信息声音文件的id3元数据被存储为一个ID3Info对象,可以使用Sound类的id3属性对其进行访问,一般访问语法如下。Sound实例.id3;14.1.9捕获声音输入除加载声音外,Flash应用程序也允许直接嵌入或捕获输入的方式来处理声音。嵌入声音是将声音文件直接导入Flash程序中,其处理方式与加载声音后的处理相同。捕获声音则可以通过Microphone类的静态方法实现。一般捕获麦克风只需要通过getMicrophone一行代码即可实现。varmic:Microphone=Microphone.getMicrophone();14.1.9捕获声音输入需要注意的是,由于来自麦克风或RTMP流的声音数据不是通过全局SoundMixer对象传递的,因此SoundMixer的computeSpectrum方法无法从这些源返回数据。此外,若要设置麦克风的SoundTransform属性,也要使用setLoopBack方法设置声音为环回模式方可。设置麦克风音源为环回模式的语法如下。varmic:Microphone=Microphone.getMicrophone();mic.setLoopBack(true);14.2处理视频使用ActionScript可以精确控制视频的加载、显示和回放。使用视频会涉及多个类的联合使用,最基本的结构包括Video类、NetStream类和NetConnection类。其中Video类的实例是一个显示对象,它产生在实现舞台上的视频内容框。NetStream实例为视频内容框提供内容的源。NetConnection实例则负责构建视频源内容源与视频内容框之间的连接。此外,与声音的Microphone类一样,视频也可以通过Camera类捕获摄像头提供的视频数据。14.2.1加载外部视频文件加载播放视频文件需要几个类配合使用。NetStream控制加载文件和播放,以播放的数据为主要控制对象。这些数据对于NetStream没有实际意义,NetStream不会将他们呈现为视频,只是按照“规则”处理它们。它处理后的数据传递给Video时,Video对象会将其渲染为视频。14.2.2视频播放的基本控制在ActionScript3.0中,对视频播放的控制是通过对视频流的控制来实现的。NetStream中的pause方法可以使视频暂停,resume方法可以使视频由暂停处恢复播放,togglePause方法则可以在暂停状态和播放状态之间切换。14.2.3视频的声音与图像加载后的视频通过Video类渲染呈现出来,Video对象本身是一个显示对象,可以象其他显示对象一样设置各种变形效果。视频的音频部分则可以通过NetStream类的soundTransform属性进行控制。例如,设置视频尺寸放大2倍时可以使用如下代码。video.scaleX=.5;设置视频的音量为1/2时则可以添加如下代码。ns.soundTransform=newSoundTransform(0.5);其中,video为Video实例,ns为NetStream实例。14.2.4metadata与回调方法当NetStream对象加载视频文件也会加载视频的metadata,加载metadata后自动调用一个名为onMetaData的回调方法。Metadata是一个元数据信息包,数字信息如下表所示。14.2.4metadata与回调方法注意:早期的flv视频文件只包含视频的高、宽和播放长度信息。metadata由ActionScript在加载视频时自动加载,并会触发onMetaData事件。由于视频加载涉及到服务器端技术,而这部分技术还停留在AcitonScript1.0和AcitonScript2.0阶段,因此其语法也与我们常见的侦听事件方法颇为不同。一般须先声明一个client对象,并定义此对象的onMetaData事件,语法如下。varclientObject:Object=newObject();clientObject.onMetaData=function(metadata:Object):void{//这里已经可以使用metadata了};//ns为NetStream实例,指定clientObject为其client属性ns.client=clientObject;取得metadata后,便可以灵活使用其所有信息了。14.2.5播放进度控制条的实现在播放视频时,最常见的控制方式是播放进度控制条。它一方面可以让用户清楚地了解当前的播放进度,同时也允许用户拖动控制条,跳到指定的位置继续播放。在以前的章节中我们已经学习过如何实现显示对象的拖动。因此,实现播放控制条的关键便在于把控制条的位置与播放头的位置进行同步。14.2.6捕获视频输入与捕获声音的操作类似,可以通过静态方法Camera.getCamera捕获视频输入。常用的语法如下。varcamera:Camera=Camera.getCamera();之后便可以使用Video类的attachCamera将捕获的视频数据加载到Video对象。//video为Video类的实例video.attachCamera(camera);因此,最基本的视频捕获只需要这两个方法便可以实现了。14.2.7视频提示点视频的提示点是一个指定的时间点。在播放视频文件时,播放头在到达该点时调度一个cuePoint事件。根据不同的目的,在不同的提示点可以设置不同的代码,以实现特定功能。例如可以在提示点上设置字幕,或将视频分割为不同的章节等。提示点可以分为3种类型:导航、事件和ActionScript类型。导航提示点和

1 / 27
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功