问题四成业原创,转载说明出处 http://hi.baidu.com/flash_as3
如何实现声音文件从指定位置开始播放
解决方法成业原创,转载说明出处 http://hi.baidu.com/flash_as3
通过设置play()方法的开始时间
具体讨论成业原创,转载说明出处 http://hi.baidu.com/flash_as3
可能会有这样的情况:我们想播放一个声音,但是并不是从它的开端开始播放。换句话说,你想把音乐的前面剪切掉一段进行播放。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参数
具体讨论成业原创,转载说明出处 http://hi.baidu.com/flash_as3
当我们播放一个声音文件的时候,默认情况下,它会从头到尾只播放一次,然后就停下来了。有时候我们会要求同一个音乐循环播放多次,甚至一直循环播放下去。比如:我们在做游戏(或者网站)的时候可能会用一个比较短小的音乐作为其背景音乐,让它循环播放,使其听起来像是一首比较长的曲子。成业原创,转载说明出处 http://hi.baidu.com/flash_as3
设置声音文件循环次数的方法是改变play()方法的第二个参数来实现的。当然我们要想怎么做的前提是必须设置第一个参数,可以参看教程四。如果我们就是想从文件的开端进行播放,只要设置第一个参数为0 就可以了,就像这样:
_sound.play(0, 3);成业原创,转载说明出处 http://hi.baidu.com/flash_as3
上面这个设置的结果是:让声音文件从头开始播放三次。
成业原创,转载说明出处 http://hi.baidu.com/flash_as3
我们极易发现一个小问题,如果我们设置looping值为1,那么循环一次;如果我们设置looping值为0(甚至不设置),那么文件也是循环播放一次。
成业原创,转载说明出处 http://hi.baidu.com/flash_as3
我们没有一个固定的参数来使得文件循环播放无限次,尽管如此,我们可以设置一个非常大的值。有一个简单的方法来实现这个问题:设置循环次数为int.MAX_VALUE,它是int类型的最大值,它等于2,147,483,647。一个简单的数学计算题,甚至我们的声音文件只有1秒钟,只要你循环2,147,483,647次,那将播放至少70年,这可以认为是无数次了吧:)
问题六
我们想创建一个声音文件加载情况的进度条,这就要求我们能获取文件的大小,及已经下载了多少了。
解决方法
访问sound对象的bytesTotal 和bytesLoaded属性。
具体讨论成业原创,转载说明出处 http://hi.baidu.com/flash_as3
对于流式的音频文件,让用户知道目前已经下载了多少数据是个不错的想法。理想情况是:声音文件的下载速度比播放速度快,这样就不会在播放的时候暂停。但是,在不稳定的网络和带宽比较窄的情况下,如果声音文件的编码率比较高,就很难保证缓冲区里总是非空的,也就很难保证不会出现暂停。
成业原创,转载说明出处 http://hi.baidu.com/flash_as3
因此,用进度条来向用户展示目前声音的加载和播放情况是一个不错的选择。你也许看过很多流媒体播放器的进度条,比如Windows Media Player或QuickTime Player。通常,会有一个进度条表示音乐的播放进度,进度条的背景色是白色的,前景有一个黑色的进度条表示目前播放的位置,另外,还有一个灰色的进度条表示目前缓冲区的情况。当灰色的进度条(缓冲buffer)比黑色的进度条(当前播放位置play position)长的时候,我们知道文件播放很流畅;当黑色的进度条赶上灰色的进度条的时候,媒体会停止播放,灰色进度条继续变长,继续向缓冲区加载数据,当它足够长的时候,媒体会继续播放,黑色进度条会继续移动,这时灰色进度条就有希望一直领先了。
成业原创,转载说明出处 http://hi.baidu.com/flash_as3
本文教你如何实现创建上面提到的灰色进度条和白色背景(以后我们将学习如何创建黑色进度条),要用到声音对象的两个属性bytesTotal 和bytesLoaded,这些属性的含义相当明了:bytesTotal 包含mp3文件总长度的信息,bytesLoaded包含当前已经下载了多少数据的信息。有了这两个值,我们就有了数据下载的百分比。
成业原创,转载说明出处 http://hi.baidu.com/flash_as3
下面的例子设定了enterFrame的处理函数,让影片每播放一帧就重新计算当前下载百分比,然后根据这个绘制进度条。