2011-03-17 40 views
0

我使用以下从声音对象中提取声音数据并将其存储在字节数组中。AS3 - 声音提取到bytearray - 进度处理程序

我要求整个MP3加载到ByteArray前进之前和下面的工作正常但是为了这个目的闪烁暂时挂起,而它提取该数据(2.4MB MP3)

有没有办法可以阻止它挂起来,即使用eventlistener来检查提取过程的进度?

iniSound(); 

function iniSound() 
{ 
    playLoadedSound(mp3); 
} 

function playLoadedSound(s:Sound):void 
{ 
    var bytes:ByteArray = new ByteArray(); 
    s.extract(bytes, int(s.length * 44.1)); 
    playSound(bytes); 
} 

function playSound(bytes:ByteArray) 
{ 
    //stop(); 
    dynamicSound = new Sound(); 
    dynamicSound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); 

    loadedMP3Samples = bytes; 
    numSamples = bytes.length/8; 

    phase = 0; 
} 

回答

0

提取的第二个参数指定要提取多少声音。把它缩小一点,只要你需要完全提取它就可以每一步都调用它。

+0

感谢,所以我提取音轨的一小部分,并尝试使用while循环的处理进度然而闪光灯仍然只是挂起,然后我得到只有在满足条件后才会有一组跟踪输出。无论如何,我可以阻止它悬挂并显示负载消息,而这是发生?代码是:function playLoadedSound(s:Sound):void { \t var bytes:ByteArray = new ByteArray(); \t while(s.extract(bytes,4096)) \t { \t \t trace(“loading”); \t} \t playSound(bytes); } – digitalpencil 2011-03-17 15:56:58

+0

不要使用while循环,请使用ENTER_FRAME或TIMER – NemoStein 2011-03-29 17:24:31

0

提取方法一次全部运行,监视进度的潜力不存在。一个更好的选择是检查声音的'isBuffering'属性,当它准备好时,开始一次提取4096个样本并保持滚动。有效地将音频从一个Sound对象传送到另一个。

添加“while”语句只是将进程分解为许多较小的块,但编译器仍尝试在一个周期/帧/内执行所有操作。

你想与预加载器进行通信?玩头时间?

1

这种方式通常工作在矿

function playLoadedSound (s:Sound) : void 
{ 
    var bytes:ByteArray = new ByteArray(); 
    s.extract (bytes, int (s.length * 44.1)); 
    playSound (s); 
} 

function playSound (bytes:ByteArray) : void 
{ 
    loadedMp3Samples = bytes; 
    loadedMp3Samples.position = 0; // reset position 

    dynamicSound = new Sound(); 
    dynamicSound.addEventListener (SampleDataEvent.SAMPLE_DATA, onSampleData); 
    dynamicSound.play(); 
} 

function onSampleData (event:SampleDataEvent) : void 
{ 
    for (var i:int ; i < 8192 && loadedMp3Samples.available > 0 ; i++) 
    { 
     var left:Number = loadedMp3Samples.readFloat(); 
     var right:Number = loadedMp3Samples.readFloat(); 
     event.data.writeFloat (left); 
     event.data.writeFloat (right); 
    } 
}