我有以下代码,它会加载声音“test.mp3”,然后降低其音调,并降低其速度。声音以较低的音高正确播放,但在采样结束时,出现以下错误:“RangeError:错误#2004:参数之一无效。”。我在做什么错,我该如何解决这个问题?任何帮助,将不胜感激。

var sourceSound:Sound = new Sound();
var outputSound:Sound = new Sound();

var urlRequest:URLRequest=new URLRequest('test.mp3');

sourceSound.load(urlRequest);
sourceSound.addEventListener(Event.COMPLETE, soundLoaded);

function soundLoaded(event:Event):void {

    outputSound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
    outputSound.play();

}

function processSound(event:SampleDataEvent):void {

    var bytes:ByteArray = new ByteArray();
    sourceSound.extract(bytes, 4096);
    var returnBytes:ByteArray = new ByteArray();
    bytes.position=0;

    while (bytes.bytesAvailable > 0) {

        returnBytes.writeFloat(bytes.readFloat());
        returnBytes.writeFloat(bytes.readFloat());
        bytes.position -= 4;
        returnBytes.writeFloat(bytes.readFloat());

    }

    event.data.writeBytes(returnBytes);

}

最佳答案

您正在运行一个无限循环,并且要在字节数组中递增,然后返回,然后再向前,因此您要执行整个六个步骤,即向前四个步骤。我将在这里更改代码,以摆脱while循环,并使用for条件替换它。我将有一个迭代的集合摘要,并确保您逐步执行字节数组的方式不会使您超出数组本身的范围,这很可能就是这种情况。如果可能,请使用数组访问器(bytearray [index])访问二进制数据,并以(i = n; i

09-05 01:23