Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash AS3-对bytearray的声音提取-进度处理程序_Flash_Actionscript 3_Audio_Bytearray - Fatal编程技术网

Flash AS3-对bytearray的声音提取-进度处理程序

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 {

我使用下面的代码从声音对象中提取声音数据,并将其存储在字节数组中

我要求在前进之前将整个mp3加载到bytearray中,下面的内容为此目的可以正常工作,但是flash在提取此数据时暂时挂起(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;
}

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_帧或计时器