AS3 - 声音提取到bytearray - 进度处理程序

时间:2011-03-17 14:53:09

标签: flash actionscript-3 audio 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;
}

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

提取的第二个参数指定要提取的声音量。只要你需要完全提取它,就把它缩小并称之为每一步。

答案 2 :(得分:0)

提取方法一次性运行,监控进度的可能性不存在。一个更好的选择是检查Sound的'isBuffering'属性,当它准备就绪时,一次开始提取4096个样本并保持滚动..有效地将音频从一个Sound对象流式传输到另一个。

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

你想用预加载器进行通信的是什么?玩头时间?