web-dev-qa-db-ja.com

フラッシュAS3のサウンドが終了したときに、どのようにループしますか?

AS3を使用してサウンドをループするために使用されるAS3コードは何ですか?

9
Noah R

これでは完璧なギャップレス再生はできませんが、サウンドがループします。

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回目の再生後に無限に再生する場合は、まだサウンドコンプリートリスナーを設定する必要があります。この方法の問題は、サウンドを一時停止/再開する必要があるかどうかです。これにより、持続時間が実際のサウンドファイルの持続時間の9999倍のsoundChannelが作成され、持続時間がサウンドの長さより長いときにplay(duration)を呼び出すと、ひどいクラッシュが発生します。

27
scriptocalypse
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();
}
10
frankhermes
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();
}

これは完全に機能します。

4
Eishia Konno

@scriptocalypseのギャップレス再生を少し拡張するには:

適切なギャップレス再生ができないという問題は、ファイルの先頭または末尾のいずれかにあるファイルに関する情報(id3タグなど)を含むmp3に起因するため、ループしようとすると少し一時停止します。状況に応じてできることがいくつかあります。

  1. それを無視して、すべてのファイルの終わりに少し休止して、通常どおりに再生します。別のサウンド(ビートドロップヨー)でマスクしたり、フェードアウトしてフェードインしたりすることもできます。
  2. サウンドが埋め込まれていてストリーミングされていない場合は、flaファイルを作成し、そこにmp3をドラッグして、エクスポートするように設定します(MovieClipなどのリンケージ名を追加するのと同じ方法です)。このようなサウンドをエクスポートする場合、Flashは遅延を考慮に入れるか、Soundオブジェクトを作成するときに遅延を取り除きます。どちらの方法でも、ギャップレス再生に必要なループを渡す単純なplay()を実行できます(loopsパラメーターを使用する方が、SOUND_COMPLETEイベントを待って再生するよりも優れていることがわかりました。もう一度)。
  3. いくつかのoggライブラリを試して、.mp3の代わりに.oggファイルを使用することができます。 「as3ogglib」をグーグルで簡単に検索すると、必要なものが見つかります。個人的には、使用するのが少し厄介で、オーバーヘッドを追加する余裕がありませんでした(プレーヤーで行われるmp3デコードとは対照的です)。
  4. Mp3ファイルがストリーミングされている場合、ギャップレス再生を実現する唯一の方法は、それらをレイヤー化することです。ギャップを特定し(エンコードに使用したものによって異なります。ファイルのギャップは約330ミリ秒です)、ギャップに達したら、オーバーレイの再生を開始します。フェードを行う場合は適切な痛みですが、機能する場合は非常にうまく機能します。最悪のシナリオでは、状況(1)になります
3
divillysausages

音声/音楽ファイルがライブラリにある場合に備えて、これを探していると思います。

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

これは私のために働いたようです:

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);
}
1
madgineer

他の答えは素晴らしいですが、(何らかの理由で)コードを使用したくない場合は、サウンドをムービークリップに入れ、soundプロパティを "Stream"に設定してから、必要な数のフレームをに追加できます。完全に再生されるようにするためのムービークリップ。

もちろん、これはあまり好ましくない方法ですが、アニメーターにとっては、状況によっては望ましい場合があると確信しています(たとえば、アニメーターがループしたい口のアニメーションと同期する場合)。

0
Olin Kirkland

私のためのこの仕事:

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);
}
0