我有以下代码加载声音'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);
}
答案 0 :(得分:1)
你正在运行一个无限循环,你正在通过字节数组递增,然后返回但是然后前进,所以你正在前进整整六步,然后返回4。我在这里更改代码一起摆脱while循环替换为for条件。我有一组迭代次数,并确保你在字节数组中上下移动的方式不会让你超出数组本身的范围,这可能就是这里发生的事情。如果可能,使用数组访问器(bytearray [index])访问二进制数据,并以(i = n; i< bytes.length; ++ i)的条件进行迭代。
答案 1 :(得分:0)
我解决了它,而不是在每次迭代时返回超过一半的字节,每隔一次迭代遍历所有字节。所以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);
}