Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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
Actionscript 3 动态生成音频乱码_Actionscript 3_Flash_Media Player - Fatal编程技术网

Actionscript 3 动态生成音频乱码

Actionscript 3 动态生成音频乱码,actionscript-3,flash,media-player,Actionscript 3,Flash,Media Player,我已经在web应用程序中创建了动态声音的标准播放器,如下所示: var _dynamicAudio:Vector.<Number> = new Vector.<Number>(); var _sampleIndex:uint = 0; // ..Code to generate '_dynamicAudio' samples omitted var _sound:Sound = new Sound(); _sound.addEventListener(SampleDat

我已经在web应用程序中创建了动态声音的标准播放器,如下所示:

var _dynamicAudio:Vector.<Number> = new Vector.<Number>();
var _sampleIndex:uint = 0;
// ..Code to generate '_dynamicAudio' samples omitted

var _sound:Sound = new Sound();
_sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleDataEvent); 
_sound.play(); 

function onSampleDataEvent(event:SampleDataEvent):void {
    var samplesRead:int = 0;

    while (samplesRead <= 8192 && _sampleIndex < _dynamicAudio.length) {
        var sample:Number = _dynamicAudio[_sampleIndex];
        event.data.writeFloat(sample); 
        event.data.writeFloat(sample); 
        _sampleIndex++;
        _samplesRead++;
    } 
}
var\u dynamicAudio:Vector.=新向量();
var_样本指数:uint=0;
//..生成“_dynamicAudio”样本的代码省略
声音:声音=新声音();
_sound.addEventListener(SampleDataEvent.SAMPLE_数据,onSampleDataEvent);
_声音。播放();
函数onSampleDataEvent(事件:SampleDataEvent):void{
var samplesRead:int=0;
while(samplesRead可能是while()循环很重,并且您并不总是拥有处理它的内存/CPU能力。因此它会冻结,并提供您描述的效果

可能会将循环分解为更小的循环,从而减少CPU负载。同时,处理事件的时间可能会提前到足以无缝播放音频的程度

以下代码未经测试,只是一个分解循环的示例:

var _dynamicAudio:Vector.<Number> = new Vector.<Number>();
var _sampleIndex:uint = 0;
// ..Code to generate '_dynamicAudio' samples omitted

var _sound:Sound = new Sound();
_sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleDataEvent); 
_sound.play(); 

function onSampleDataEvent(event:SampleDataEvent):void {
    var samplesRead:int = 0;

    writeSamples(0, event);
}


function writeSamples(counter:int, eventReference:SampleDataEvent):void
{
    var startTime:int = getTimer();


    while (samplesRead <= (8192 - counter) && _sampleIndex < _dynamicAudio.length)
    {
        // check if the processing takes too long
        if (getTimer() - startTime > 5)
        {
            writeSamples(counter, eventReference);
            break;
        }

        counter++;

        var sample:Number = _dynamicAudio[_sampleIndex];
        event.data.writeFloat(sample); 
        event.data.writeFloat(sample); 
        _sampleIndex++;
        _samplesRead++;
    }

}
var\u dynamicAudio:Vector.=新向量。();
var_样本指数:uint=0;
//..生成“_dynamicAudio”样本的代码省略
声音:声音=新声音();
_sound.addEventListener(SampleDataEvent.SAMPLE_数据,onSampleDataEvent);
_声音。播放();
函数onSampleDataEvent(事件:SampleDataEvent):void{
var samplesRead:int=0;
写入示例(0,事件);
}
函数writeSamples(计数器:int,事件引用:SampleDataEvent):void
{
var startTime:int=getTimer();
while(样本阅读5)
{
写入示例(计数器、事件引用);
打破
}
计数器++;
变量样本:数字=_dynamicAudio[_sampleIndex];
event.data.writeFloat(示例);
event.data.writeFloat(示例);
_sampleIndex++;
_samplesRead++;
}
}
预览代码的主要思想是:

1) 检查while循环执行的时间是否过长。在我的例子中,5ms是极限 2) 如果执行太长,则中断循环,并从停止位置再次启动循环

如果整个过程花费的时间少于限制,循环将一次性完成


您可能希望重构代码,因为它没有经过优化,并且会产生大量垃圾,而不是重用对象。

谢谢您的提示!我以前已经分析过onSampleDataEvent函数,它总是在很长的时间内完成执行。当故障发生时,它似乎根本没有被调用。不管怎样,我会尝试一下,让你知道它是否有效——不管怎么说,这看起来都是一个很好的做法。如果你的代码执行时间超过了执行限制,我想它只会停止当前线程,但限制是15秒,我想你不会有这样的延迟。奇怪的是,为什么这个方法根本没有被调用。