- 浏览: 898139 次
- 性别:
- 来自: 青岛
文章分类
最新评论
-
chienchia:
请问下,第4步,vpn做了什么使数据包发送到真实网卡,而不会再 ...
如何使用Android系统自带的VPN服务框架 -
fangyafenqidai:
我只要选第二个就可以呢,怒需要选第一个。之后不会有啥问题。正常 ...
Android Studio 超级简单的打包生成apk -
michaelye1988:
不错,很棒!
getcachedir和getexternalcachedir的区别 -
whlei01:
文章棒棒哒
常用的AS3代码 -
whlei01:
很不错 之前打开及时600M的内存 ,现在打开只有300兆了 ...
flash builder内存不够的解决办法
解决第一个问题:
如何把声音文件作为一个变量加载到swf文件中。
创建一个Sound对象,然后加载具体的声音文件到里面
创建一个Sound对象和创建其他对象一样简单,首先我们必须保证相关的类已经被导入。
import flash.media.Sound;
然后,直接创建声音对象的一个实例就可以了:
_sound = new Sound();
当然,现在你还需要为声音对象一个具体的声音,比如一首歌,结下来,我们在例子中提到的所有音乐都用song.mp3来代替,把它保存在.swf文件同一个目录下。
要想加载声音文件到刚刚建立的Sound对象中,还要先创建一个URLRequest对象(在此我们还必须导入相关的类import flash.net.URLRequest,通过字符串表示mp3文件的路径:
soundFile = new URLRequest("song.mp3");
接下来,我们就可以用下面这个语句来实现加载声音文件了:
_sound.load(soundFile);
当然我们还可以把上面的步骤用下面的方法来实现:
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
public class LoadSoundExample extends Sprite {
private var _sound:Sound;
public function LoadSoundExample( ) {
_sound = new Sound( );
_sound.load(new URLRequest("song.mp3"));
}
}
}
上面的类LoadSoundExample就有了一个_sound属性,你可以在任何时候用它来播放音乐。说明一下:此时的声音还并没有开始播放。现在我们只是设置了有一个声音(sound)和它具体是什么样的声音(song.mp3)。具体如何播放该声音请看后面的教程。
下面说一种更快捷的解决上面问题的方法:
public function LoadSoundExample( ) { _sound = new Sound(new URLRequest("song.mp3"));}
当你用这种方法创建_sound文件的时候,实际上sound是调用其内部函数load()并开始加载数据了,如果你只想用你的sound对象加载一个声音文件的时候,这时一种非常简便的方法。
否则,也许先创建一个sound对象,然后当我们有需要的时候,调用它的load方法来加载数据会好一些。这面应用的例子比如:一个音乐播放器,当用户选择了一首歌之后,sound对象调用被选中歌曲的地址,这样就为播发这首歌曲做好准备了。
问题二
如何播放一个或者停止一个音乐的播放
解决方法
用sound对象的play()方法开始播放声音,用sound对象的close()方法停止音乐的播放。
具体讨论
播放一个已经加载好的sound文件时非常简单的,只要调用sound对象的play()方法就可以了,比如:
_sound = new Sound(new URLRequest("song.mp3")); _sound.play( );
上面的是最简单的情况,play()方法还有其他的一些附加功能,我们以后讨论。
用close()函数不止是让声音文件停止了播放,事实上,它还停止了数据流的加载,如果要想在次播放该声音,我们还应该调用load()方法重新加载声音数据。所以,close()方法的使用范围由一些限制,比如我们想暂时停止播放,那该怎么办呢?
请看后续翻译
问题三
如何确保声音播放的更流畅
解决方案
用SoundLoaderContext类设置声音的缓冲
Sound类控制的是流式音频媒体,也就有了了这样的问题,当我们播放某个文件的时候,很有可能文件还没下载完毕。尤其是一些大文件,比如整首歌长达若干MB的那种。
根据声音的编码方式(不同的编码方式文件的大小不一样)和可利用的带宽,声音文件的播放速度有可能比其下载速度要快,这样就会导致 “播放必须停下来等等下载”。为了避免这种情况的发生,我们可以设置sound对象的缓冲,缓冲可以使sound对象在播放之前预下载一些。这样,如果带宽不足导致播放时断时续,设置缓冲可以有效的解决这个问题。
默认情况下,sound对象有一秒钟的缓冲,换句话说,就是你让它立即播放,声音文件的播放还是会等后一秒钟的内容下载到本地以后,才播放当前一秒的内容。另外,如果缓冲区被用完而sound对象的播放停下来了,那么后赶来的数据会先把缓冲区填满才允许sound对象播放。
如果我们不确定网络的具体情况或者声音以高位速编码(每秒钟播放较多位的数据)的时候,我们可以设置缓冲区的大小来保证文件的流畅播放。这时我们要创建一个SoundLoaderContext对象,通过设置缓冲区的大小,(单位:毫秒)来解决这个问题。比如,我们可以这样做来创建5秒钟的缓冲:
buffer = new SoundLoaderContext(5000);
应用这个缓冲有两种方法:
1. 在创建sound对象的时作为参数使用;
2. 在使用sound对象的load()方法时作为参数使用。
具体代码如下:
//在创建sound对象的时作为参数使用;
var request:URLRequest = new URLRequest("song.mp3");
var buffer:SoundLoaderContext = new SoundLoaderContext(5000);
_sound = new Sound(request, buffer);
_sound.play( );
//在使用sound对象的load()方法时作为参数使用。
var request:URLRequest = new URLRequest("song.mp3");
var buffer:SoundLoaderContext = new SoundLoaderContext(5000);
_sound = new Sound( );
_sound.load(request, buffer);
_sound.play( );
问题四
如何实现声音文件从指定位置开始播放
解决方法:
通过设置play()方法的开始时间
可能会有这样的情况:我们想播放一个声音,但是并不是从它的开端开始播放。换句话说,你想把音乐的前面剪切掉一段进行播放。Sound对象为我们提供了一种简单而有效的方法来解决这个问题,让我们能指定声音从什么位置开始播放,精确到毫秒。
如果我们不带任何参数地调用sound对象的play()方法,那么它会从文件的开端开始播放。但是我们还可以在调用的时候添加一个数字类型的参数,指定声音文件从第多少毫秒开始播放。比如:下面的代码将表示从文件的开端向后跳5.5秒开始播放:
_sound.play(5500);
这个方法特别有助于我们解决这样的问题:我们手头的声音文件头部有一些内容是我们不想要的,但是又不好编辑这个声音文件,我们就可以用这个方法来跳过我们不要的部分。
另外一个例子是:我们手头有某人的讲话录音,他在开始的时候说了各部分的要点。现在,允许用户自由选择他们感兴趣的部分。这时,我们就可以把各部分开始的时间存放在一个数组里,然后通过选择的部分可以从数理找到对应的开始时间(开始位置),再把这个时间传给play()方法。下面是例程:
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
public class CuePoints extends Sprite {
private var _sound:Sound;
private var _cuePoints:Array;
public function CuePoints( ) {
_cuePoints = [0, 10000, 30000, 68000, 120000];
_sound = new Sound(new URLRequest("song.mp3"));
// 从第二点开始播放(第30秒开始)
playCuePoint(2);
}
public function playCuePoint(index:int):void {
_sound.play(_cuePoints[index]);
}
}
}
当然,这是一个很不完善的应用程序,具体操作的时候,我们还应该有一些按钮,或者其他的和用户交互的对象,党和用户进行交互的时候把它的索引值(index)传递给上面的playCuePoint()方法就可以了
问题五
如何重复播放同一个音乐(循环播放)
解决方案
设置play()方法的looping参数
当我们播放一个声音文件的时候,默认情况下,它会从头到尾只播放一次,然后就停下来了。有时候我们会要求同一个音乐循环播放多次,甚至一直循环播放下去。比如:我们在做游戏(或者网站)的时候可能会用一个比较短小的音乐作为其背景音乐,让它循环播放,使其听起来像是一首比较长的曲子。
设置声音文件循环次数的方法是改变play()方法的第二个参数来实现的。当然我们要想怎么做的前提是必须设置第一个参数,可以参看教程四[原创]ActionScript3 使用sound类(e文翻译)——设置开始时间。如果我们就是想从文件的开端进行播放,只要设置第一个参数为0 就可以了,就像这样:
_sound.play(0, 3);
上面这个设置的结果是:让声音文件从头开始播放三次。
我们极易发现一个小问题,如果我们设置looping值为1,那么循环一次;如果我们设置looping值为0(甚至不设置),那么文件也是循环播放一次。
nn 我们没有一个固定的参数来使得文件循环播放无限次,尽管如此,我们可以设置一个非常大的值。有一个简单的方法来实现这个问题:设置循环次数为int.MAX_VALUE,它是int类型的最大值,它等于2,147,483,647。一个简单的数学计算题,甚至我们的声音文件只有1秒钟,只要你循环2,147,483,647次,那将播放至少70年,这可以认为是无数次了吧:)
问题六
我们想创建一个声音文件加载情况的进度条,这就要求我们能获取文件的大小,及已经下载了多少了。
解决方法
访问sound对象的bytesTotal 和bytesLoaded属性。
对于流式的音频文件,让用户知道目前已经下载了多少数据是个不错的想法。理想情况是:声音文件的下载速度比播放速度快,这样就不会在播放的时候暂停。但是,在不稳定的网络和带宽比较窄的情况下,如果声音文件的编码率比较高,就很难保证缓冲区里总是非空的,也就很难保证不会出现暂停。
因此,用进度条来向用户展示目前声音的加载和播放情况是一个不错的选择。你也许看过很多流媒体播放器的进度条,比如Windows Media Player或QuickTime Player。通常,会有一个进度条表示音乐的播放进度,进度条的背景色是白色的,前景有一个黑色的进度条表示目前播放的位置,另外,还有一个灰色的进度条表示目前缓冲区的情况。当灰色的进度条(缓冲buffer)比黑色的进度条(当前播放位置play position)长的时候,我们知道文件播放很流畅;当黑色的进度条赶上灰色的进度条的时候,媒体会停止播放,灰色进度条继续变长,继续向缓冲区加载数据,当它足够长的时候,媒体会继续播放,黑色进度条会继续移动,这时灰色进度条就有希望一直领先了。
本文教你如何实现创建上面提到的灰色进度条和白色背景(以后我们将学习如何创建黑色进度条),要用到声音对象的两个属性bytesTotal 和bytesLoaded,这些属性的含义相当明了:bytesTotal 包含mp3文件总长度的信息,bytesLoaded包含当前已经下载了多少数据的信息。有了这两个值,我们就有了数据下载的百分比。
下面的例子设定了enterFrame的处理函数,让影片每播放一帧就重新计算当前下载百分比,然后根据这个绘制进度条。
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.Event;
public class ProgressBar extends Sprite {
private var _sound:Sound;
public function ProgressBar( ) {
addEventListener(Event.ENTER_FRAME, onEnterFrame);
_sound = new Sound(new URLRequest("song.mp3"));
_sound.play( );
}
public function onEnterFrame(event:Event):void{
var barWidth:int = 200;
var barHeight:int = 5;
var loaded:int = _sound.bytesLoaded;
var total:int = _sound.bytesTotal;
if(total > 0) {
// 绘制白背景
graphics.clear( );
graphics.beginFill(0xFFFFFF);
graphics.drawRect(10, 10, barWidth, barHeight);
graphics.endFill( );
// 已经加载数据的百分比
var percent:Number = loaded / total;
// Draw a bar that represents the percent of
// the sound that has loaded
graphics.beginFill(0xCCCCCC);
graphics.drawRect(10, 10,barWidth * percent, barHeight);
graphics.endFill( );
}
}
}
}
如果我们把声音文件放在本地机器上进行测试,可能会看不到灰色进度条慢慢增长的效果,它会一下子变成100%,如果可能,把文件放在网络上进行测试,这样你就能看到效果了。注意:当你第二次或后面测试的时候,请清空浏览器的缓存,否则,会和在本地机器上测试的效果一样。
问题七
我们现在想获取正在播放的MP3文件的一些相关信息,比如:艺术家、音乐集、风格, 等。
解决方案
读取sound对象的id3属性
MP3文件中可以包含很多关于声音文件的一些数据,这些数据通常包含艺术家、音乐集、发行时间、作曲家、等。包含信息的多少取决于制作或为这个音乐添加标签的人。在绝大多数情况下,我们至少可以从中获取歌曲名和艺术家的标签。
这些数据是我们用ActionScript通过访问sound对象的id3属性来得到的。
这些属性是flash.media.ID3Info 类的实例,它包含下面的一些具体属性:
album
artist
comment
genre
songName
TRack
year
所以要想知道音乐的名字,你可以这样做:
_sound.id3.songName
上面只是一个例子,注意:我们不能在音乐还没有真正下载到swf文件中就去获取这些信息。如果想在声音文件刚刚创建完毕或者刚刚开始播放就获取这些信息,将是不成功的。因为那时声音文件的具体信息还没下载到swf文件中,所以此时没有相关数据可用。
我们如何知道知道声音文件的id3相关数据已经到达swf文件中了呢?幸运的是,sound对象有个ID3事件可供我们侦听,这个事件发生了,就表明可以安全地读取id3数据了。Sound对象继承了EventDispatcher类,因此我们可以用事件侦听函数来侦听这个事件(这个事件被定义为flash.events.Event.ID3),然后添加一个事件处理函数,来读取id3的信息。
下面的例子创建了一个文本框,并在其中列出了id3的所有信息
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.Event;
import flash.text.TextField;
public class ID3Reader extends Sprite {
private var _sound:Sound;
public function ID3Reader ( ) {
_sound = new Sound(new URLRequest("song.mp3"));
_sound.addEventListener(Event.ID3, onID3);
_sound.play( );
}
public function onID3(event:Event):void {
// Create a text field and display it
var id3Display:TextField = new TextField( );
addChild(id3Display);
id3Display.x = 10;
id3Display.y = 20;
id3Display.width = 200;
id3Display.height = 200;
id3Display.background = true;
id3Display.multiline = true;
id3Display.wordWrap = true;
// Add some info about the song to the text field
id3Display.text += _sound.id3.songName + "\n";
id3Display.text += _sound.id3.artist + "\n";
id3Display.text += _sound.id3.album + "\n";
id3Display.text += _sound.id3.year + "\n";
}
}
}
译者注:上面的这个例子的使用方法:
1, 新建立一个fla文件,命名,保存;
2, 找一首歌曲(mp3格式)复制到fla的那个目录里面,命名为song.mp3(mp3是后缀名);
3, 新建一个.as文件,把上述代码复制到其中,保存为ID3Reader.as保存在fla同一个目录;
4, 把fla文件的document属性(选中舞台,打开属性面板就能看到)设置为ID3Reader;
5, 按ctrl+enter测试。
[url][/url]
问题八
当我们播放音乐以后,想知道声音何时播放结束。(成业注:当我们播放完一首歌曲后想播放器自动切换到下一首,这时就需要音乐播放结束的消息)
解决方法
侦听soundComplete事件
有很多时候我们需要知道音乐在什么时候播放结束。比如:在正式的内容开始之前,我们想让用户先听完一段介绍,那么就需要获取介绍是否播放结束的信息;再比如:有个带索音乐列表的播放器,当一首歌播放完毕之后要自动切换到下一首,就需要获取当前的歌是否已经播放结束。
这一节中我们开始讨论另外一个类,它叫做flash.media.SoundChannel。当我们调用sound对象的play()方法的时候,它返回一个SoundChannel对象。各种声音在swf文件中播放都有唯一的一个SoundChannel对象代表,所有的这些SoundChannel混合在一起构成了最终的音频输出。
当一个声音文件播放结束的时候,和它绑定的SoundChannel对象将引发一个soundComplete事件,它被定义为:flash.events.Event.SOUND_COMPLETE.我们可以为SoundChannel对象的SOUND_COMPLETE事件添加一个事件处理函数,处理当声音播放结束的时候,程序干什么。
下面的例子演示了一个简单的播放列表(a simple playlist)
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.Event;
import flash.media.SoundChannel;
public class PlayList extends Sprite {
private var _sound:Sound;
private var _channel:SoundChannel;
private var _playList:Array;
//歌曲列表
private var _index:int = 0;
//当前歌曲
public function PlayList( ) {
//创建歌曲列表并开始播放
_playList = ["song1.mp3",
"song2.mp3",
"song3.mp3"];
playNextSong( );
}
private function playNextSong( ):void{
//如果列表中还有歌曲的话
if(_index < _playList.length) {
//创建一个新的Sound对象,加载并播放之
// 数组_playList[_index]包含了要播放的下一首歌歌名及路径
_sound = new Sound( );
_sound.load(new URLRequest(_playList[_index]));
_channel = _sound.play( );
// 为_channel添加事件侦听处理函数
_channel.addEventListener(Event.SOUND_COMPLETE,onComplete);
// 计数器加1
_index++;
}
}
public function onComplete(event:Event):void{
playNextSong( );
}
}
}
这里,变量index从0开始计数,它将导致_playList[index]值变成为"song.mp3",这样第一个加载的歌曲是"song.mp3"。然后,index的值增加了,当soundComplete事件被引发,playNextSong()方法加载了_playList里的下一首歌,直到index的值比列表里的歌曲还大为止。
译者注:上面的这个例子的使用方法:
1,新建立一个fla文件,命名,保存;
2,找三首歌曲(mp3格式)复制到fla的那个目录里面,命名为song1.mp3,song2.mp3,song3.mp3(mp3是后缀名);
3,新建一个.as文件,把上述代码复制到其中,保存在fla同一个目录,命名为PlayList.as;
4,把fla文件的document class属性(选中舞台,打开属性面板就能看到)设置为PlayList;
5,按ctrl+enter测试。我们将依次听到上面的三首歌
问题九
我们想知道当前的歌曲已经播放了百分之几(意译)
解决方法
用Sound.length获取声音文件的长度,用SoundChannel.position获取当前播放了多少。
问题六ActionScript3 使用sound类——获取文件大小中,我们提到了如何添加一个不仅显示下载进度还显示播放进度的进度条,那一节中学习了创建显示下载进度的部分。
本节讨论另外一个部分:如何跟踪播放进度。为了实现这个目标,我们必须知道两个量:当前文件播放位置是多少和文件总长度。虽然它们看起来差不多,但是它们却在不同的类中,文件长度信息是sound对象的一个属性,当前播放位置在SoundChannel类中。类似于问题六[原创]ActionScript3 使用sound类(e文翻译)——获取文件大小中创建已下载进度条一样,有这两个量很容易得到播放进度条。
不幸的是,播放进度条做起来比下载进度条要复杂,因为声音文件的总长度要等到声音文件全部下载完毕之后才能得到,此时读取文件长度只是得到了已经下载的声音文件的长度。因此,比如:以个十分钟的音乐,下载了10%,它的长度(length)是一分钟。(事实上,length和position都返回毫秒为单位的数据,如果需要,我们也可以把它转换成“分:秒”的表示形式)
幸运的是,我们只要经过一点小小的数学运算就能得到文件的总长度(毫秒),我们拿当前文件的长度(毫秒)除以当前已经下载下来的百分比,结果将非常接近文件的实际长度(毫秒)。说一下刚刚提到的例子:长度返回值是1分钟,这个一分钟是指已经下载的文件长度。当我们拿这个一分钟除以1/10,就能得到结果是10,这样我们就得到了文件的总长度是10分钟。
上面提到的百分比是用bytesLoaded/bytesTotal得到的,这个值是我们在做下载进度条时候用过并存起来的,所以所以文件总长度只要一行代码就能实现了:
length /= percentBuffered;
说明:问题六[原创]ActionScript3 使用sound类——获取文件大小中,我们提到了要想正确显示进度条要清空缓存的问题,在此不再重复。下面的代码展示了如何把两个进度条放在一起:
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import flash.events.Event;
public class ProgressBar2 extends Sprite {
private var _sound:Sound;
private var _channel:SoundChannel;
public function ProgressBar2( ) {
addEventListener(Event.ENTER_FRAME, onEnterFrame);
_sound = new Sound(new URLRequest("song.mp3"));
_channel = _sound.play( );
}
public function onEnterFrame(event:Event):void{
var barWidth:int = 200;
var barHeight:int = 5;
var loaded:int = _sound.bytesLoaded;
var total:int = _sound.bytesTotal;
var length:int = _sound.length;
var position:int = _channel.position;
// Draw a background bar
graphics.clear( );
graphics.beginFill(0xFFFFFF);
graphics.drawRect(10, 10, barWidth, barHeight);
graphics.endFill( );
if(total > 0) {
// The percent of the sound that has loaded
var percentBuffered:Number = loaded / total;
// Draw a bar that represents the percent of
// the sound that has loaded
graphics.beginFill(0xCCCCCC);
graphics.drawRect(10, 10,barWidth * percentBuffered, barHeight);
graphics.endFill( );
// Correct the sound length calculation
length /= percentBuffered;
// The percent of the sound that has played
var percentPlayed:Number = position / length;
// Draw a bar that represents the percent of
// the sound that has played
graphics.beginFill(0x666666);
graphics.drawRect(10, 10, barWidth * percentPlayed, barHeight);
graphics.endFill( );
}
}
}
}
译者注:上面的这个例子的使用方法:
1,新建立一个fla文件,命名,保存;
2,找首歌曲(mp3格式)复制到fla的那个目录里面,命名为song.mp3(mp3是后缀名);
3,新建一个.as文件,把上述代码复制到其中,保存在fla同一个目录,命名为ProgressBar2.as;
4,把fla文件的document class属性(选中舞台,打开属性面板就能看到)设置为ProgressBar2,设置背景颜色为兰色(只要不是白色黑色灰色就行);
5,按ctrl+enter测试。我们看到效果。
如果看不到加载进度,请换个网络上的歌曲试试看。
问题十
如何暂停声音,如何从暂停的地方继续播放声音。
解决方法
通过记录当前声音的SoundChannel的position属性值,继续播放时用刚刚的值恢复一下。
具体讨论
在问题二中提到了sound对象的close()方法,它可以用来停止一个声音文件的播放,但是,同时它也停止了声音文件的加载,当重新播放的时候,我们必须重新调用load()方法。
幸运的是,SoundChannel类提供了一个stop()方法,它可以使声音文件停止播放而不停止加载,当再次播放音乐的时候,只要调用play()方法就可以了。
我们应该记住:不管什么时候只要是使用play()方法都是从文件开头进行播放的,这相当于播放器中的“STOP■”按钮。创建一个“PAUSE‖”按钮稍微有点麻烦。解决的策略是:当按下按钮的时候调用一个事件处理函数:这个函数从SoundChannel中读取当前的position数据并把它保存起来,它提供了声音文件已经播放了多少毫秒。把这个量保存为类级别的,以便后面调用。此时,“PAUSE‖”按钮变成“PLAY”按钮,当再次被按下的时候,调用sound对象的play()方法,通过刚才保存的位置信息,就能恢复到刚才停下来的那地方继续播放,下面给出例程:
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.Sprite;
import flash.events.MouseEvent;
public class PlayPause extends Sprite {
private var _sound:Sound;
private var _channel:SoundChannel;
private var _playPauseButton:Sprite;
private var _playing:Boolean = false;
private var _position:int;
public function PlayPause( ) {
// 创建一个声音对象,并播放之
_sound = new Sound(new URLRequest("song.mp3"));
_channel = _sound.play( );
_playing = true;
//一个作为Play/Pause按钮的sprite
_playPauseButton = new Sprite( );
addChild(_playPauseButton);
_playPauseButton.x = 10;
_playPauseButton.y = 20;
_playPauseButton.graphics.beginFill(0xcccccc);
_playPauseButton.graphics.drawRect(0, 0, 20, 20);
_playPauseButton.addEventListener(MouseEvent.MOUSE_UP,
onPlayPause);
}
public function onPlayPause(event:MouseEvent):void {
// 如果正在播放,停止,记下当前位置信息
if(_playing) {
_position = _channel.position;
_channel.stop( );
}
else {
// 如果未播放,从记录处开始播放
//
_channel = _sound.play(_position);
}
_playing = !_playing;
}
}
}
以上代码创建了一个sprite图像作为按钮,为其鼠标抬起事件添加了事件处理函数,如果当前声音正在播放,则停止当前播放,并记录当前位置,如果当前已经停止,则从刚才记录的位置开始播放。
如何把声音文件作为一个变量加载到swf文件中。
创建一个Sound对象,然后加载具体的声音文件到里面
创建一个Sound对象和创建其他对象一样简单,首先我们必须保证相关的类已经被导入。
import flash.media.Sound;
然后,直接创建声音对象的一个实例就可以了:
_sound = new Sound();
当然,现在你还需要为声音对象一个具体的声音,比如一首歌,结下来,我们在例子中提到的所有音乐都用song.mp3来代替,把它保存在.swf文件同一个目录下。
要想加载声音文件到刚刚建立的Sound对象中,还要先创建一个URLRequest对象(在此我们还必须导入相关的类import flash.net.URLRequest,通过字符串表示mp3文件的路径:
soundFile = new URLRequest("song.mp3");
接下来,我们就可以用下面这个语句来实现加载声音文件了:
_sound.load(soundFile);
当然我们还可以把上面的步骤用下面的方法来实现:
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
public class LoadSoundExample extends Sprite {
private var _sound:Sound;
public function LoadSoundExample( ) {
_sound = new Sound( );
_sound.load(new URLRequest("song.mp3"));
}
}
}
上面的类LoadSoundExample就有了一个_sound属性,你可以在任何时候用它来播放音乐。说明一下:此时的声音还并没有开始播放。现在我们只是设置了有一个声音(sound)和它具体是什么样的声音(song.mp3)。具体如何播放该声音请看后面的教程。
下面说一种更快捷的解决上面问题的方法:
public function LoadSoundExample( ) { _sound = new Sound(new URLRequest("song.mp3"));}
当你用这种方法创建_sound文件的时候,实际上sound是调用其内部函数load()并开始加载数据了,如果你只想用你的sound对象加载一个声音文件的时候,这时一种非常简便的方法。
否则,也许先创建一个sound对象,然后当我们有需要的时候,调用它的load方法来加载数据会好一些。这面应用的例子比如:一个音乐播放器,当用户选择了一首歌之后,sound对象调用被选中歌曲的地址,这样就为播发这首歌曲做好准备了。
问题二
如何播放一个或者停止一个音乐的播放
解决方法
用sound对象的play()方法开始播放声音,用sound对象的close()方法停止音乐的播放。
具体讨论
播放一个已经加载好的sound文件时非常简单的,只要调用sound对象的play()方法就可以了,比如:
_sound = new Sound(new URLRequest("song.mp3")); _sound.play( );
上面的是最简单的情况,play()方法还有其他的一些附加功能,我们以后讨论。
用close()函数不止是让声音文件停止了播放,事实上,它还停止了数据流的加载,如果要想在次播放该声音,我们还应该调用load()方法重新加载声音数据。所以,close()方法的使用范围由一些限制,比如我们想暂时停止播放,那该怎么办呢?
请看后续翻译
问题三
如何确保声音播放的更流畅
解决方案
用SoundLoaderContext类设置声音的缓冲
Sound类控制的是流式音频媒体,也就有了了这样的问题,当我们播放某个文件的时候,很有可能文件还没下载完毕。尤其是一些大文件,比如整首歌长达若干MB的那种。
根据声音的编码方式(不同的编码方式文件的大小不一样)和可利用的带宽,声音文件的播放速度有可能比其下载速度要快,这样就会导致 “播放必须停下来等等下载”。为了避免这种情况的发生,我们可以设置sound对象的缓冲,缓冲可以使sound对象在播放之前预下载一些。这样,如果带宽不足导致播放时断时续,设置缓冲可以有效的解决这个问题。
默认情况下,sound对象有一秒钟的缓冲,换句话说,就是你让它立即播放,声音文件的播放还是会等后一秒钟的内容下载到本地以后,才播放当前一秒的内容。另外,如果缓冲区被用完而sound对象的播放停下来了,那么后赶来的数据会先把缓冲区填满才允许sound对象播放。
如果我们不确定网络的具体情况或者声音以高位速编码(每秒钟播放较多位的数据)的时候,我们可以设置缓冲区的大小来保证文件的流畅播放。这时我们要创建一个SoundLoaderContext对象,通过设置缓冲区的大小,(单位:毫秒)来解决这个问题。比如,我们可以这样做来创建5秒钟的缓冲:
buffer = new SoundLoaderContext(5000);
应用这个缓冲有两种方法:
1. 在创建sound对象的时作为参数使用;
2. 在使用sound对象的load()方法时作为参数使用。
具体代码如下:
//在创建sound对象的时作为参数使用;
var request:URLRequest = new URLRequest("song.mp3");
var buffer:SoundLoaderContext = new SoundLoaderContext(5000);
_sound = new Sound(request, buffer);
_sound.play( );
//在使用sound对象的load()方法时作为参数使用。
var request:URLRequest = new URLRequest("song.mp3");
var buffer:SoundLoaderContext = new SoundLoaderContext(5000);
_sound = new Sound( );
_sound.load(request, buffer);
_sound.play( );
问题四
如何实现声音文件从指定位置开始播放
解决方法:
通过设置play()方法的开始时间
可能会有这样的情况:我们想播放一个声音,但是并不是从它的开端开始播放。换句话说,你想把音乐的前面剪切掉一段进行播放。Sound对象为我们提供了一种简单而有效的方法来解决这个问题,让我们能指定声音从什么位置开始播放,精确到毫秒。
如果我们不带任何参数地调用sound对象的play()方法,那么它会从文件的开端开始播放。但是我们还可以在调用的时候添加一个数字类型的参数,指定声音文件从第多少毫秒开始播放。比如:下面的代码将表示从文件的开端向后跳5.5秒开始播放:
_sound.play(5500);
这个方法特别有助于我们解决这样的问题:我们手头的声音文件头部有一些内容是我们不想要的,但是又不好编辑这个声音文件,我们就可以用这个方法来跳过我们不要的部分。
另外一个例子是:我们手头有某人的讲话录音,他在开始的时候说了各部分的要点。现在,允许用户自由选择他们感兴趣的部分。这时,我们就可以把各部分开始的时间存放在一个数组里,然后通过选择的部分可以从数理找到对应的开始时间(开始位置),再把这个时间传给play()方法。下面是例程:
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
public class CuePoints extends Sprite {
private var _sound:Sound;
private var _cuePoints:Array;
public function CuePoints( ) {
_cuePoints = [0, 10000, 30000, 68000, 120000];
_sound = new Sound(new URLRequest("song.mp3"));
// 从第二点开始播放(第30秒开始)
playCuePoint(2);
}
public function playCuePoint(index:int):void {
_sound.play(_cuePoints[index]);
}
}
}
当然,这是一个很不完善的应用程序,具体操作的时候,我们还应该有一些按钮,或者其他的和用户交互的对象,党和用户进行交互的时候把它的索引值(index)传递给上面的playCuePoint()方法就可以了
问题五
如何重复播放同一个音乐(循环播放)
解决方案
设置play()方法的looping参数
当我们播放一个声音文件的时候,默认情况下,它会从头到尾只播放一次,然后就停下来了。有时候我们会要求同一个音乐循环播放多次,甚至一直循环播放下去。比如:我们在做游戏(或者网站)的时候可能会用一个比较短小的音乐作为其背景音乐,让它循环播放,使其听起来像是一首比较长的曲子。
设置声音文件循环次数的方法是改变play()方法的第二个参数来实现的。当然我们要想怎么做的前提是必须设置第一个参数,可以参看教程四[原创]ActionScript3 使用sound类(e文翻译)——设置开始时间。如果我们就是想从文件的开端进行播放,只要设置第一个参数为0 就可以了,就像这样:
_sound.play(0, 3);
上面这个设置的结果是:让声音文件从头开始播放三次。
我们极易发现一个小问题,如果我们设置looping值为1,那么循环一次;如果我们设置looping值为0(甚至不设置),那么文件也是循环播放一次。
nn 我们没有一个固定的参数来使得文件循环播放无限次,尽管如此,我们可以设置一个非常大的值。有一个简单的方法来实现这个问题:设置循环次数为int.MAX_VALUE,它是int类型的最大值,它等于2,147,483,647。一个简单的数学计算题,甚至我们的声音文件只有1秒钟,只要你循环2,147,483,647次,那将播放至少70年,这可以认为是无数次了吧:)
问题六
我们想创建一个声音文件加载情况的进度条,这就要求我们能获取文件的大小,及已经下载了多少了。
解决方法
访问sound对象的bytesTotal 和bytesLoaded属性。
对于流式的音频文件,让用户知道目前已经下载了多少数据是个不错的想法。理想情况是:声音文件的下载速度比播放速度快,这样就不会在播放的时候暂停。但是,在不稳定的网络和带宽比较窄的情况下,如果声音文件的编码率比较高,就很难保证缓冲区里总是非空的,也就很难保证不会出现暂停。
因此,用进度条来向用户展示目前声音的加载和播放情况是一个不错的选择。你也许看过很多流媒体播放器的进度条,比如Windows Media Player或QuickTime Player。通常,会有一个进度条表示音乐的播放进度,进度条的背景色是白色的,前景有一个黑色的进度条表示目前播放的位置,另外,还有一个灰色的进度条表示目前缓冲区的情况。当灰色的进度条(缓冲buffer)比黑色的进度条(当前播放位置play position)长的时候,我们知道文件播放很流畅;当黑色的进度条赶上灰色的进度条的时候,媒体会停止播放,灰色进度条继续变长,继续向缓冲区加载数据,当它足够长的时候,媒体会继续播放,黑色进度条会继续移动,这时灰色进度条就有希望一直领先了。
本文教你如何实现创建上面提到的灰色进度条和白色背景(以后我们将学习如何创建黑色进度条),要用到声音对象的两个属性bytesTotal 和bytesLoaded,这些属性的含义相当明了:bytesTotal 包含mp3文件总长度的信息,bytesLoaded包含当前已经下载了多少数据的信息。有了这两个值,我们就有了数据下载的百分比。
下面的例子设定了enterFrame的处理函数,让影片每播放一帧就重新计算当前下载百分比,然后根据这个绘制进度条。
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.Event;
public class ProgressBar extends Sprite {
private var _sound:Sound;
public function ProgressBar( ) {
addEventListener(Event.ENTER_FRAME, onEnterFrame);
_sound = new Sound(new URLRequest("song.mp3"));
_sound.play( );
}
public function onEnterFrame(event:Event):void{
var barWidth:int = 200;
var barHeight:int = 5;
var loaded:int = _sound.bytesLoaded;
var total:int = _sound.bytesTotal;
if(total > 0) {
// 绘制白背景
graphics.clear( );
graphics.beginFill(0xFFFFFF);
graphics.drawRect(10, 10, barWidth, barHeight);
graphics.endFill( );
// 已经加载数据的百分比
var percent:Number = loaded / total;
// Draw a bar that represents the percent of
// the sound that has loaded
graphics.beginFill(0xCCCCCC);
graphics.drawRect(10, 10,barWidth * percent, barHeight);
graphics.endFill( );
}
}
}
}
如果我们把声音文件放在本地机器上进行测试,可能会看不到灰色进度条慢慢增长的效果,它会一下子变成100%,如果可能,把文件放在网络上进行测试,这样你就能看到效果了。注意:当你第二次或后面测试的时候,请清空浏览器的缓存,否则,会和在本地机器上测试的效果一样。
问题七
我们现在想获取正在播放的MP3文件的一些相关信息,比如:艺术家、音乐集、风格, 等。
解决方案
读取sound对象的id3属性
MP3文件中可以包含很多关于声音文件的一些数据,这些数据通常包含艺术家、音乐集、发行时间、作曲家、等。包含信息的多少取决于制作或为这个音乐添加标签的人。在绝大多数情况下,我们至少可以从中获取歌曲名和艺术家的标签。
这些数据是我们用ActionScript通过访问sound对象的id3属性来得到的。
这些属性是flash.media.ID3Info 类的实例,它包含下面的一些具体属性:
album
artist
comment
genre
songName
TRack
year
所以要想知道音乐的名字,你可以这样做:
_sound.id3.songName
上面只是一个例子,注意:我们不能在音乐还没有真正下载到swf文件中就去获取这些信息。如果想在声音文件刚刚创建完毕或者刚刚开始播放就获取这些信息,将是不成功的。因为那时声音文件的具体信息还没下载到swf文件中,所以此时没有相关数据可用。
我们如何知道知道声音文件的id3相关数据已经到达swf文件中了呢?幸运的是,sound对象有个ID3事件可供我们侦听,这个事件发生了,就表明可以安全地读取id3数据了。Sound对象继承了EventDispatcher类,因此我们可以用事件侦听函数来侦听这个事件(这个事件被定义为flash.events.Event.ID3),然后添加一个事件处理函数,来读取id3的信息。
下面的例子创建了一个文本框,并在其中列出了id3的所有信息
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.Event;
import flash.text.TextField;
public class ID3Reader extends Sprite {
private var _sound:Sound;
public function ID3Reader ( ) {
_sound = new Sound(new URLRequest("song.mp3"));
_sound.addEventListener(Event.ID3, onID3);
_sound.play( );
}
public function onID3(event:Event):void {
// Create a text field and display it
var id3Display:TextField = new TextField( );
addChild(id3Display);
id3Display.x = 10;
id3Display.y = 20;
id3Display.width = 200;
id3Display.height = 200;
id3Display.background = true;
id3Display.multiline = true;
id3Display.wordWrap = true;
// Add some info about the song to the text field
id3Display.text += _sound.id3.songName + "\n";
id3Display.text += _sound.id3.artist + "\n";
id3Display.text += _sound.id3.album + "\n";
id3Display.text += _sound.id3.year + "\n";
}
}
}
译者注:上面的这个例子的使用方法:
1, 新建立一个fla文件,命名,保存;
2, 找一首歌曲(mp3格式)复制到fla的那个目录里面,命名为song.mp3(mp3是后缀名);
3, 新建一个.as文件,把上述代码复制到其中,保存为ID3Reader.as保存在fla同一个目录;
4, 把fla文件的document属性(选中舞台,打开属性面板就能看到)设置为ID3Reader;
5, 按ctrl+enter测试。
[url][/url]
问题八
当我们播放音乐以后,想知道声音何时播放结束。(成业注:当我们播放完一首歌曲后想播放器自动切换到下一首,这时就需要音乐播放结束的消息)
解决方法
侦听soundComplete事件
有很多时候我们需要知道音乐在什么时候播放结束。比如:在正式的内容开始之前,我们想让用户先听完一段介绍,那么就需要获取介绍是否播放结束的信息;再比如:有个带索音乐列表的播放器,当一首歌播放完毕之后要自动切换到下一首,就需要获取当前的歌是否已经播放结束。
这一节中我们开始讨论另外一个类,它叫做flash.media.SoundChannel。当我们调用sound对象的play()方法的时候,它返回一个SoundChannel对象。各种声音在swf文件中播放都有唯一的一个SoundChannel对象代表,所有的这些SoundChannel混合在一起构成了最终的音频输出。
当一个声音文件播放结束的时候,和它绑定的SoundChannel对象将引发一个soundComplete事件,它被定义为:flash.events.Event.SOUND_COMPLETE.我们可以为SoundChannel对象的SOUND_COMPLETE事件添加一个事件处理函数,处理当声音播放结束的时候,程序干什么。
下面的例子演示了一个简单的播放列表(a simple playlist)
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.Event;
import flash.media.SoundChannel;
public class PlayList extends Sprite {
private var _sound:Sound;
private var _channel:SoundChannel;
private var _playList:Array;
//歌曲列表
private var _index:int = 0;
//当前歌曲
public function PlayList( ) {
//创建歌曲列表并开始播放
_playList = ["song1.mp3",
"song2.mp3",
"song3.mp3"];
playNextSong( );
}
private function playNextSong( ):void{
//如果列表中还有歌曲的话
if(_index < _playList.length) {
//创建一个新的Sound对象,加载并播放之
// 数组_playList[_index]包含了要播放的下一首歌歌名及路径
_sound = new Sound( );
_sound.load(new URLRequest(_playList[_index]));
_channel = _sound.play( );
// 为_channel添加事件侦听处理函数
_channel.addEventListener(Event.SOUND_COMPLETE,onComplete);
// 计数器加1
_index++;
}
}
public function onComplete(event:Event):void{
playNextSong( );
}
}
}
这里,变量index从0开始计数,它将导致_playList[index]值变成为"song.mp3",这样第一个加载的歌曲是"song.mp3"。然后,index的值增加了,当soundComplete事件被引发,playNextSong()方法加载了_playList里的下一首歌,直到index的值比列表里的歌曲还大为止。
译者注:上面的这个例子的使用方法:
1,新建立一个fla文件,命名,保存;
2,找三首歌曲(mp3格式)复制到fla的那个目录里面,命名为song1.mp3,song2.mp3,song3.mp3(mp3是后缀名);
3,新建一个.as文件,把上述代码复制到其中,保存在fla同一个目录,命名为PlayList.as;
4,把fla文件的document class属性(选中舞台,打开属性面板就能看到)设置为PlayList;
5,按ctrl+enter测试。我们将依次听到上面的三首歌
问题九
我们想知道当前的歌曲已经播放了百分之几(意译)
解决方法
用Sound.length获取声音文件的长度,用SoundChannel.position获取当前播放了多少。
问题六ActionScript3 使用sound类——获取文件大小中,我们提到了如何添加一个不仅显示下载进度还显示播放进度的进度条,那一节中学习了创建显示下载进度的部分。
本节讨论另外一个部分:如何跟踪播放进度。为了实现这个目标,我们必须知道两个量:当前文件播放位置是多少和文件总长度。虽然它们看起来差不多,但是它们却在不同的类中,文件长度信息是sound对象的一个属性,当前播放位置在SoundChannel类中。类似于问题六[原创]ActionScript3 使用sound类(e文翻译)——获取文件大小中创建已下载进度条一样,有这两个量很容易得到播放进度条。
不幸的是,播放进度条做起来比下载进度条要复杂,因为声音文件的总长度要等到声音文件全部下载完毕之后才能得到,此时读取文件长度只是得到了已经下载的声音文件的长度。因此,比如:以个十分钟的音乐,下载了10%,它的长度(length)是一分钟。(事实上,length和position都返回毫秒为单位的数据,如果需要,我们也可以把它转换成“分:秒”的表示形式)
幸运的是,我们只要经过一点小小的数学运算就能得到文件的总长度(毫秒),我们拿当前文件的长度(毫秒)除以当前已经下载下来的百分比,结果将非常接近文件的实际长度(毫秒)。说一下刚刚提到的例子:长度返回值是1分钟,这个一分钟是指已经下载的文件长度。当我们拿这个一分钟除以1/10,就能得到结果是10,这样我们就得到了文件的总长度是10分钟。
上面提到的百分比是用bytesLoaded/bytesTotal得到的,这个值是我们在做下载进度条时候用过并存起来的,所以所以文件总长度只要一行代码就能实现了:
length /= percentBuffered;
说明:问题六[原创]ActionScript3 使用sound类——获取文件大小中,我们提到了要想正确显示进度条要清空缓存的问题,在此不再重复。下面的代码展示了如何把两个进度条放在一起:
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import flash.events.Event;
public class ProgressBar2 extends Sprite {
private var _sound:Sound;
private var _channel:SoundChannel;
public function ProgressBar2( ) {
addEventListener(Event.ENTER_FRAME, onEnterFrame);
_sound = new Sound(new URLRequest("song.mp3"));
_channel = _sound.play( );
}
public function onEnterFrame(event:Event):void{
var barWidth:int = 200;
var barHeight:int = 5;
var loaded:int = _sound.bytesLoaded;
var total:int = _sound.bytesTotal;
var length:int = _sound.length;
var position:int = _channel.position;
// Draw a background bar
graphics.clear( );
graphics.beginFill(0xFFFFFF);
graphics.drawRect(10, 10, barWidth, barHeight);
graphics.endFill( );
if(total > 0) {
// The percent of the sound that has loaded
var percentBuffered:Number = loaded / total;
// Draw a bar that represents the percent of
// the sound that has loaded
graphics.beginFill(0xCCCCCC);
graphics.drawRect(10, 10,barWidth * percentBuffered, barHeight);
graphics.endFill( );
// Correct the sound length calculation
length /= percentBuffered;
// The percent of the sound that has played
var percentPlayed:Number = position / length;
// Draw a bar that represents the percent of
// the sound that has played
graphics.beginFill(0x666666);
graphics.drawRect(10, 10, barWidth * percentPlayed, barHeight);
graphics.endFill( );
}
}
}
}
译者注:上面的这个例子的使用方法:
1,新建立一个fla文件,命名,保存;
2,找首歌曲(mp3格式)复制到fla的那个目录里面,命名为song.mp3(mp3是后缀名);
3,新建一个.as文件,把上述代码复制到其中,保存在fla同一个目录,命名为ProgressBar2.as;
4,把fla文件的document class属性(选中舞台,打开属性面板就能看到)设置为ProgressBar2,设置背景颜色为兰色(只要不是白色黑色灰色就行);
5,按ctrl+enter测试。我们看到效果。
如果看不到加载进度,请换个网络上的歌曲试试看。
问题十
如何暂停声音,如何从暂停的地方继续播放声音。
解决方法
通过记录当前声音的SoundChannel的position属性值,继续播放时用刚刚的值恢复一下。
具体讨论
在问题二中提到了sound对象的close()方法,它可以用来停止一个声音文件的播放,但是,同时它也停止了声音文件的加载,当重新播放的时候,我们必须重新调用load()方法。
幸运的是,SoundChannel类提供了一个stop()方法,它可以使声音文件停止播放而不停止加载,当再次播放音乐的时候,只要调用play()方法就可以了。
我们应该记住:不管什么时候只要是使用play()方法都是从文件开头进行播放的,这相当于播放器中的“STOP■”按钮。创建一个“PAUSE‖”按钮稍微有点麻烦。解决的策略是:当按下按钮的时候调用一个事件处理函数:这个函数从SoundChannel中读取当前的position数据并把它保存起来,它提供了声音文件已经播放了多少毫秒。把这个量保存为类级别的,以便后面调用。此时,“PAUSE‖”按钮变成“PLAY”按钮,当再次被按下的时候,调用sound对象的play()方法,通过刚才保存的位置信息,就能恢复到刚才停下来的那地方继续播放,下面给出例程:
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.Sprite;
import flash.events.MouseEvent;
public class PlayPause extends Sprite {
private var _sound:Sound;
private var _channel:SoundChannel;
private var _playPauseButton:Sprite;
private var _playing:Boolean = false;
private var _position:int;
public function PlayPause( ) {
// 创建一个声音对象,并播放之
_sound = new Sound(new URLRequest("song.mp3"));
_channel = _sound.play( );
_playing = true;
//一个作为Play/Pause按钮的sprite
_playPauseButton = new Sprite( );
addChild(_playPauseButton);
_playPauseButton.x = 10;
_playPauseButton.y = 20;
_playPauseButton.graphics.beginFill(0xcccccc);
_playPauseButton.graphics.drawRect(0, 0, 20, 20);
_playPauseButton.addEventListener(MouseEvent.MOUSE_UP,
onPlayPause);
}
public function onPlayPause(event:MouseEvent):void {
// 如果正在播放,停止,记下当前位置信息
if(_playing) {
_position = _channel.position;
_channel.stop( );
}
else {
// 如果未播放,从记录处开始播放
//
_channel = _sound.play(_position);
}
_playing = !_playing;
}
}
}
以上代码创建了一个sprite图像作为按钮,为其鼠标抬起事件添加了事件处理函数,如果当前声音正在播放,则停止当前播放,并记录当前位置,如果当前已经停止,则从刚才记录的位置开始播放。
发表评论
-
as3中颜色矩阵滤镜ColorMatrixFilter的使用
2015-05-11 15:32 1220public static function chan ... -
AS3.0 关于用URLLoader加载外部图片
2015-04-02 17:09 961很多人都想当然的直接用URLLoader加载外部图片然后通 ... -
Flash AS3 让<鼠标点击>穿透上层透明区域,下层对象触发<鼠标点击>事件
2017-10-24 13:54 932问题描述:1. 在Stage上放置2个Sprite, A ... -
关于 AS3 Socket 通信基础(六)
2017-10-24 14:02 7166.处理使用Sockets时候引发的错误. 在程序 ... -
关于 AS3 Socket 通信基础(五)
2015-04-01 16:50 8335.与Socket服务器断开,或者当服务器想与你断开的时候发 ... -
关于 AS3 Socket 通信基础(四)
2015-04-01 16:50 7294.同Socket服务器进行 ... -
关于 AS3 Socket 通信基础(三)
2015-04-01 16:49 12333.从Socket服务器读数据 ... -
关于 AS3 Socket 通信基础(二)
2015-04-01 16:49 931对于Socket对象来说,通过 ... -
AS3 Socket 通信基础(一)
2015-04-01 16:48 1054我们先来搞清几个概念,这有助于我们更加了解网络通信! 1、 ... -
as3.0针对两个独立swf的通信有个专门的类-----LocalConnection
2015-01-16 17:43 1982as3.0针对两个独立swf的通信有个专门的类-----Lo ... -
检测FlashPlayer版本的代码
2014-12-22 14:17 769var versionString:String = Cap ... -
as3.0中复制mc影片剪辑的方法
2014-05-23 16:17 1016方法1——反射方法: var ClassRef:Class ... -
as3类库大全
2014-05-04 16:14 828类库大全地址: http://www.adrianparr ... -
AIR版截屏跟QQ截屏一样 (源码)
2014-04-14 16:54 917两个Demo,一个是Flex项目,另一个是ActionScri ... -
AS3将网址加入收藏夹
2014-01-20 14:22 1058AS3: ExternalInterface.call(& ... -
FLASH AS3 TextField 文本超链接控制示例(新闻列表)
2013-10-30 15:23 1059这两天想自行设计一个唐酷的AS3+XML新闻列表(http:/ ... -
AS3动态文本框支持单击事件
2013-10-30 15:21 1121AS3动态文本框支持单击事件 用TextEvent.LINK ... -
AS3 变灰的代码
2013-08-23 15:32 749var filter:Filter = new ColorMa ... -
AS3 String to Date
2013-08-12 15:57 1711var formatterString:String = &q ... -
greensock又出重量级产品 - LoaderMax
2013-05-27 11:30 12031、线性化下载过程 一般的下载队列,是一口气推入n个load ...
相关推荐
在ActionScript 3.0中,`Sound`类及其相关类提供了一套强大的音频处理工具,使开发者能够有效地集成音频资源到Flash项目中,无论是游戏、交互式网站还是多媒体演示。本文将深入探讨如何在AS 3.0中使用`Sound`类及其...
ActionScript3提供Sound类和SoundChannel类来加载和播放音频资源。 9. **用户界面(UI)**:尽管这是一个简单的游戏,但仍然可能包含一些基本的UI元素,如得分显示、开始/暂停按钮等。这些可以通过创建文本字段和...
在本教程中,我们将深入探讨如何使用Flash ActionScript3(AS3)进行游戏开发,特别是创建一个名为"小as3 demo 1个人投掷西瓜把另1个人砸死"的简单游戏。ActionScript3是Adobe Flash Platform的核心编程语言,它为...
6. **声音与音乐**:AS3的Sound和SoundChannel类能播放背景音乐和游戏音效,增强游戏体验。 7. **舞台管理**:游戏场景的切换,如进入新关卡或结束游戏,需要管理不同阶段的显示对象。 8. **对象池**:为了优化...
4. **显示列表**:在Flash Player中,AS3使用显示列表来管理舞台上的视觉元素,包括`DisplayObject`、`Sprite`和`MovieClip`等类,它们允许开发者创建复杂的动画和交互式图形。 5. **ActionScript3的库**:AS3标准...
AS3提供了Sound和Video类,分别用于处理音频和视频。 3. 文件选择:用户需要能够选择本地文件进行播放,这通常通过FileReference类实现,它允许用户通过弹出对话框选择文件。 4. 事件处理:播放器需要响应用户的操作...
首先,我们需要了解ActionScript中的声音类(Sound Class)。这个类提供了加载、播放、控制和处理音频的基本功能。在我们的案例中,我们将使用Sound类来加载和播放MP3文件。以下是一个基础的MP3加载和播放的示例: ...
3. **动画与视觉效果**:使用AS3的DisplayObject类和Timeline动画,可以创建出丰富多彩的游戏场景和角色动画。比如,鱼游动的轨迹、炮弹飞行的效果、捕获鱼时的爆炸动画等。 4. **用户交互**:游戏必须响应用户的...
ActionScript3(AS3)是Adobe开发的一种编程语言,主要用于创建富互联网应用程序(RIA),特别是与Flash Player和Adobe AIR平台配合使用。AS3是ActionScript的重大升级,它引入了许多新特性,提高了性能,并且语法...
它使用类来构建程序结构,支持接口和包,这使得代码更加模块化和易于维护。此外,AS3的性能显著提升,使得它能够处理更复杂的游戏逻辑和图形渲染。 在开发“愤怒的小鸟”这样的物理引擎游戏时,AS3的...
11. **音频和视频处理**:利用Sound和Video类,ActionScript可以播放、控制和处理音频和视频内容。 12. **本地存储**:通过LocalConnection和SharedObject,ActionScript可以实现客户端的数据存储和跨域通信。 13....
3. **多媒体接口**:Flash Player提供了`flash.media.Sound`和`flash.media.Video`类来处理音频和视频。`Sound`类用于播放音频,而`Video`类则与视频帧和摄像头输入相关联。我们需要使用这些类的实例来加载、解码和...
4. **Sound和SoundChannel类**:处理音频播放,包括加载、播放和控制音频文件。 5. **TimelineControl类**:控制播放器的时间线,实现快进、快退、播放和暂停等功能。 6. **Controls类**:如播放按钮、暂停按钮、...
1. Sound和Video类:分别用于处理音频和视频,可以播放、暂停、停止以及调整音量。 2. NetStream和NetConnection:用于流式传输音频和视频,实现与其他服务器的实时交互。 八、错误处理 1. try/catch/finally:用于...
6. 动画和图形:AS3提供了丰富的图形和动画功能,如使用Shape和Graphics类绘制矢量图形,以及使用Tween类创建平滑的动画效果。 7. Sound和Video:AS3提供对音频和视频的全面支持,包括播放、控制、处理和合成等操作...
8. **音频和视频处理**:掌握如何播放、暂停和控制音频和视频文件,包括使用Sound和Video类进行基本的媒体操作。 9. **错误处理和调试**:了解如何使用try...catch语句处理运行时错误,以及使用ActionScript的内置...
ActionScript 3.0还支持声音和视频处理,提供了Sound和Video类,允许开发者进行音频和视频的播放、控制和处理。这些特性使得ActionScript在多媒体应用开发中占有一席之地。 在学习ActionScript 3.0的过程中,你需要...
6. **音频和视频操作**:了解如何加载、播放和控制音频和视频文件,包括使用Sound和Video类。 7. **网络通信**:ActionScript 2.0支持XML、URLLoader和XMLSocket等,可以用来获取或发送网络数据,实现数据交换。 8...
使用Sound和NetStream类可以处理音频和视频播放;使用LocalConnection类可以实现在同一台计算机上的不同Flash应用间的通信。 "ActionScript 3.0 编程.pdf"这份文档很可能是关于ActionScript 3.0的教程或参考手册,...
3. **文件加载**:在ActionScript中,可以使用`flash.net`包中的`FileReference`或`URLLoader`类来加载本地文件。`FileReference`适用于用户选择文件的场景,`URLLoader`则适用于编程方式指定的文件路径。加载完成后...