如何在闪存AS3结束时循环播放声音?

时间:2011-03-26 16:36:06

标签: actionscript-3 audio

AS3代码用于使用AS3循环声音?

8 个答案:

答案 0 :(得分:27)

这不会给你完美无间隙的播放,但它会导致声音循环播放。

var sound:Sound = new Sound();
var soundChannel:SoundChannel;

sound.addEventListener(Event.COMPLETE, onSoundLoadComplete);

sound.load("yourmp3.mp3");


// we wait until the sound finishes loading and then play it, storing the
// soundchannel so that we can hear when it "completes".
function onSoundLoadComplete(e:Event):void{
    sound.removeEventListener(Event.COMPLETE, onSoundLoadComplete);
    soundChannel = sound.play();
    soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundChannelSoundComplete);
}

//  this is called when the sound channel completes.
function onSoundChannelSoundComplete(e:Event):void{
    e.currentTarget.removeEventListener(Event.SOUND_COMPLETE, onSoundChannelSoundComplete);
    soundChannel = sound.play();
}

如果您想要通过完美无缝的无间隙播放多次循环声音,您可以拨打

sound.play(0, 9999); // 9999 means to loop 9999 times

但是如果你想在第9999次播放后想要无限播放,仍然需要设置一个声音完整的监听器。这种做事方式的问题是你必须暂停/重启声音。这将创建一个soundChannel,其持续时间比实际声音文件的持续时间长9999倍,并且当持续时间长于声音长度导致可怕的崩溃时调用播放(持续时间)。

答案 1 :(得分:10)

var sound:Sound = whateverSoundYouNeedToPlay;
function playSound():void
{
    var channel:SoundChannel = sound.play();
    channel.addEventListener(Event.SOUND_COMPLETE, onComplete);
}

function onComplete(event:Event):void
{
    SoundChannel(event.target).removeEventListener(event.type, onComplete);
    playSound();
}

答案 2 :(得分:4)

import flash.media.Sound;
import flash.media.SoundChannel;

var mySound:Sound = new Bgm(); //Bgm() is the class of the internal sound which can be done in the library panel. 

playSound();

function playSound():void
{
    var channel:SoundChannel = mySound.play();
    channel.addEventListener(Event.SOUND_COMPLETE, onComplete);
}

function onComplete(event:Event):void
{
    SoundChannel(event.target).removeEventListener(event.type, onComplete);
    playSound();
}

这很有效。

答案 3 :(得分:3)

稍微扩展@ scriptocalypse的无间隙播放:

没有正确无间隙播放的问题来自mp3,包括文件头部或尾部的文件信息(id3标签等),因此当你尝试循环播放时会出现小暂停。根据您的具体情况,您可以做一些事情。

  1. 忽略它,只是正常播放,每个文件末尾有一个小暂停。您也可以尝试用另一种声音(嘀嗒嘀嗒)来掩饰它,或者淡出并淡入。
  2. 如果您的声音是嵌入式的,而不是流式传输,那么创建一个fla文件,将mp3拖放到那里,然后将它们设置为导出(就像为MovieClip添加链接名称一样)。看起来当你导出这样的声音时,Flash会考虑延迟,或者在创建Sound对象时将其删除。无论哪种方式,你都可以做一个简单的play()传递你想要的无间隙回放循环(我发现使用loops参数比等待SOUND_COMPLETE事件更好再玩一次)。
  3. 您可以尝试使用某些ogg库来使用.ogg文件而不是.mp3。一个简单的谷歌搜索“as3 ogg lib”将找到你需要的东西。就个人而言,我发现它们使用起来有点尴尬,我无法负担增加的开销(而不是mp3解码,这是在播放器中完成的。)
  4. 如果你的mp3文件是流媒体,那么获得无间隙播放的唯一方法就是分层。确定差距(取决于你用来编码它们的内容,它会有所不同 - 我的文件有大约330毫秒的间隙),当你到达它时,开始播放叠加层。如果你正在褪色,这是一个适当的痛苦,但是当它起作用时,它的效果非常好。最糟糕的情况是,你最终得到的情况是(1)

答案 4 :(得分:2)

我想这就是你在寻找语音/音乐文件在库中的内容:

var mysound:my_sound = new my_sound();
mysound.play(0,2); // this will repeat the sound 2 times.

答案 5 :(得分:1)

这似乎对我有用:

var nowTime:Number = (new Date()).time;
var timeElapsed:Number = nowTime - _lastTime;

_lastTime = nowTime;
_musicTimeElapsed+=timeElapsed;

if(_musicTimeElapsed >= _musicA.length - GAP_LENGTH)
{
   _musicTimeElapsed = 0;
   _musicA.play(0);
}

答案 6 :(得分:0)

其他答案很棒,但是如果您不想使用代码(无论出于何种原因),您可以将声音放入movieclip,将声音属性设置为“Stream”,然后添加尽可能多的帧喜欢影片剪辑,以确保它充分发挥。

当然,这是一种不太优选的方式,但对于动画师来说,我确信它在某些情况下可能更为可取(例如,当与动画师想要循环的口部动画同步时)。

答案 7 :(得分:0)

这对我有用:

import flash.media.Sound;
import flash.media.SoundChannel;

var soundUrl:String ="music.mp3";
var soundChannel:SoundChannel = new SoundChannel();
var sound:Sound = new Sound();

sound.load(new URLRequest(soundUrl));
soundChannel = sound.play();
soundChannel.addEventListener(Event.SOUND_COMPLETE,onComplete);

function onComplete(e:Event):void{
    sound = new Sound();
    sound.load(new URLRequest(soundUrl));
    soundChannel = sound.play();
    soundChannel.addEventListener(Event.SOUND_COMPLETE,onComplete);
}