ActionScript 3 - RangeError: Ошибка № 2004 - Что я делаю не так? - PullRequest
0 голосов
/ 04 апреля 2011

У меня есть следующий код, который загружает звук '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);

}

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Вы выполняете бесконечный цикл, и вы увеличиваете массив байтов, затем назад, но затем вперед, так что вы делаете целых шесть шагов вперед, 4 назад.Я бы изменил код здесь все вместе, чтобы избавиться от цикла while, заменив его на условный.Я бы собрал набор итераций и гарантировал, что то, как вы шагаете вверх и вниз по байт-массиву, не выводит вас за пределы самого массива, что, вероятно, и происходит здесь.Если возможно, получите доступ к двоичным данным, используя методы доступа к массиву (bytearray [index]) и выполните итерации с условием (i = n; i

0 голосов
/ 04 апреля 2011

Я решил это, вместо того, чтобы возвращаться более половины байтов на каждой итерации, проходя все байты на каждой другой итерации.Таким образом, функция processSound теперь выглядит так:

function processSound(event:SampleDataEvent):void {

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

    var returnBytes:ByteArray = new ByteArray();

    var count:int;

    while (bytes.bytesAvailable > 0) {

        returnBytes.writeFloat(bytes.readFloat());
        returnBytes.writeFloat(bytes.readFloat());

        count++;

        if (count%2 === 0) {

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

        }

    }

    event.data.writeBytes(returnBytes);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...