我已经加载了mp3文件并且我已经提取了字节数组。 我可以播放字节数组,但是当我想改变字节数组时,我听到了一点小故障。
如果我将原始波形文件加载到闪存中并在时间轴上播放它们,没有任何故障,但如果我从库中获取波形文件(那将是mp3),它们在从一个字节数组转到另一个字节时仍然会出现故障在as3 ..
有谁知道如何解决这个问题?
这是我在读取字节数组时使用的代码
public function getSoundData():ByteArray{
mixBytes.position = 0;
// IF no sounds, plsy silent note
if (activeSounds.length==0) {
trace("no sound", silentSound.position, totalTime);
for (var k:int=0;k< 4096; k++) {
if(silentSound.position < totalTime){
mixBytes.writeFloat(silentSound.readFloat());
partPosition = silentSound.position;
}else{
p.gotoNextSequence();
reset();
return mixBytes;
}
//partPosition++;
}
trace("s", mixBytes.length);
return mixBytes;
} // sanity check
// ELSE IF ANY SOUND
// GET MIX THE VALUES
var mixrate:Number=1.0/activeSounds.length;
for (var i:int=0;i< BUFFER_SIZE;i++) { // adjust number accordingly
var tm:int=0; // how many tracks mixed
var f:Number=0;
for each(var b:ByteArray in activeSounds){
b.position = partPosition;
if (b.position < b.length) {
// this track isn't finished
tm++;
f+=b.readFloat();
// trace(b.length);
partPosition = b.position;
}
}
if (tm==0) { // all tracks reached end, stop mixing
trace("done mixing now!");
p.gotoNextSequence();
reset();
return mixBytes;
}
mixBytes.writeFloat(f*mixrate);
}
trace("l", mixBytes.length);
return mixBytes;
}
编辑:
我有一个带有soundPart的数组,上面的代码在soundPart中。 当Sound对象需要更多数据时,我运行以下代码:
var bytes:ByteArray = completeSong[sequenceNumberActiv].getSoundData();
bytes.position = 0;
while(bytes.bytesAvailable > 0) {
e.data.writeFloat(bytes.readFloat());
e.data.writeFloat(bytes.readFloat());
}
当声音部分完成时,我更新变量 sequenceNumberActiv ,以便从下一个声音部分获取字节。
并且我不认为通过更改阵列来实现延迟,因为我已经尝试将两个声音部分写入一个字节数组并循环通过它并且仍然存在一些问题。
我确实将wav导入flash并将压缩设置为raw。这似乎解决了这个问题。但我有数百个音乐文件,所以我需要使用mp3。
我导入的mp3在试听中检查时没有淡入或淡出,但是它比原始声音文件有更多的字节...
所以我试图用运气好的方式删除字节数组的开头和结尾,并且那里没有一致性......所以我说它有效,但我觉得还不够好。对此的任何想法都会有所帮助:)。