2012-01-01 6 views
1

httpサーバにいくつかのオーディオファイルがあります。ActionScript3でFlashクライアントを作成して、それらのオーディオファイルをロードしてスムーズに再生したいと考えています。もちろん、私はSoundオブジェクトを作成し、URLリクエストで.load()でロードすることができます。しかし、帯域幅を節約するために、私は必要に応じてオーディオファイルのチャンクを読み込むことを好みます。たとえば、オーディオファイルがあり、100MBとします。我々がロードしようとした場合、できるだけユーザーがFlashを使用して、異なるファイルからサウンドトラックをシームレスに再生できますか?

<--------- 100MB -----------> 

ページを開くと、高速ダウンロードが数分以内に終了しますが、途中でのは言わせて、もしユーザー停止リスナーがあり、それは最初に全体のサウンドトラックをロードするための廃棄物のようなものです。

この問題を解決するには、大きなオーディオファイルを小さなチャンクに分割し、必要に応じて読み込んで再生する方がよいと思います。

<--- 10MB ---><--- 10MB ---><--- 10MB ---> ... 
            ^--- user current position 

私は、プレーヤーの設計それはチャンクによってオーディオチャンクをロードしてみましょう、とだけ、それは現在のチャンクの終わり近くだときにそれをロードします。

ここで質問があります。これらのチャンクを読み込んでスムーズに再生するにはどうすればいいですか?私はおそらく各チャンクのためのサウンドオブジェクトを作成することができます。しかし、それらをシームレスにする方法は?

答えて

1

おそらくSoundChannelを使用し、そこにはexampletutorialを使用します。サウンドがロードされると、サウンドを再生し、ポジションを保存し、長さを取得して再生時間を知ることができます。そこから、おそらく次のサウンドをロードするイベントをディスパッチします。 2番目の例から派生しました(クラス構造を置く必要があります):

// Note that you will need some type of sound management 
// class to listen to events and to play the series of sounds. 
// That is not documented here. 

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 

var snd:Sound = new Sound(); 
var req:URLRequest = new URLRequest("sound1.mp3"); 
snd.load(req); 

var channel:SoundChannel; 
channel = snd.play(); 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 

function onEnterFrame(event:Event):void 
{ 
    var estimatedLength:int = 
     Math.ceil(snd.length/(snd.bytesLoaded/snd.bytesTotal)); 
    var playbackPercent:uint = 
     Math.round(100 * (channel.position/estimatedLength)); 
    if(playbackPercent > 75) 
     loadNextSound(); 
    trace("Sound playback is " + playbackPercent + "% complete."); 
} 

function loadNextSound() 
{ 
    // In whatever sound manager class you create, 
    // listen for this "loadNextSound" event, 
    // and start the next sound loading when it occurs. 
    dispatchEvent(new Event("loadNextSound")); 

} 


function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
    removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
} 
関連する問題