Flash AS3-对bytearray的声音提取-进度处理程序
我使用下面的代码从声音对象中提取声音数据,并将其存储在字节数组中 我要求在前进之前将整个mp3加载到bytearray中,下面的内容为此目的可以正常工作,但是flash在提取此数据时暂时挂起(2.4mb mp3) 有没有办法阻止它挂起,即使用eventlistener检查提取过程的进度Flash AS3-对bytearray的声音提取-进度处理程序,flash,actionscript-3,audio,bytearray,Flash,Actionscript 3,Audio,Bytearray,我使用下面的代码从声音对象中提取声音数据,并将其存储在字节数组中 我要求在前进之前将整个mp3加载到bytearray中,下面的内容为此目的可以正常工作,但是flash在提取此数据时暂时挂起(2.4mb mp3) 有没有办法阻止它挂起,即使用eventlistener检查提取过程的进度 iniSound(); function iniSound() { playLoadedSound(mp3); } function playLoadedSound(s:Sound):void {
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;
}
extract的第二个参数指定要提取多少声音。将其缩小,并在需要完全提取时调用每个步骤。提取方法一次运行,不存在监控进度的可能性。一个更好的选择是检查声音的“isBuffering”属性,当它准备好时,开始一次提取4096个样本并保持滚动。。有效地将音频从一个声音对象流到另一个声音对象 添加“while”语句只是将流程分解为许多较小的块,编译器仍在尝试在一个周期/帧/任何时间内完成所有工作
您试图与预加载程序通信什么?玩人头游戏?这种方法通常在我的游戏中有效
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);
}
}
函数playLoadedSound(s:Sound):无效
{
var bytes:ByteArray=newbytearray();
s、 提取(字节,整数(s.length*44.1));
播放声音(s);;
}
函数播放声音(字节:ByteArray):无效
{
loadedMp3Samples=字节;
loadedMp3Samples.position=0;//重置位置
dynamicSound=新声音();
dynamicSound.addEventListener(SampleDataEvent.SAMPLE_数据,onSampleData);
dynamicSound.play();
}
函数onSampleData(事件:SampleDataEvent):void
{
对于(变量i:int;i<8192&&loadedMp3Samples.available>0;i++)
{
var left:Number=loadedMp3Samples.readFloat();
var right:Number=loadedMp3Samples.readFloat();
event.data.writeFloat(左);
event.data.writeFloat(右);
}
}
谢谢,所以我提取了一小部分音频曲目,并尝试对进度处理程序使用while循环,但flash仍然挂起,只有在满足条件后,我才能获得一系列跟踪输出。在发生这种情况时,我是否可以停止挂起并显示加载消息?代码是:函数playLoadedSound(s:Sound):void{var bytes:ByteArray=newbytearray();while(s.extract(bytes,4096)){trace(“load”);}playSound(bytes);}不要使用while循环,使用ENTER_帧或计时器