Если вы нацелены на flash player 10+, вы можете использовать sampleData
событие и extract
метод класса звука, чтобы объединить два звука.
По сути, вам нужно создать подкласс Sound, который обрабатывает событие sampleData
, передавая позицию методу extract
каждого из двух звуков, которые вы хотите воспроизвести.Затем вы скомбинируете два ByteArray
s и вставите их в data
элемент события.
Главное, на что следует обратить внимание, это то, что вы можете дать только максимум8k данных (если я правильно помню) на событие sampleData
одновременно.Вы также, вероятно, захотите усреднить два звука или, по крайней мере, уменьшить громкость при объединении звуков.
Прошло немного времени с тех пор, как я написал ActionScript, поэтому мне потребовалось немного временинаписать код для вас, но если вам все еще нужна помощь, дайте мне знать, и я постараюсь дать вам больше информации или код.
EDIT
Вот минимальный класс, который будет делать то, что вы хотите.Вы должны добавить проверку ошибок, и вам может понадобиться добавить материал для обработки звуковых преобразований (например, регулировки громкости), так как при использовании события сэмплов данных может игнорироваться звуковое преобразование, которое вы применяете во время воспроизведения (я не помню, но это не должно быть слишкомвам трудно понять это ^ _ ^) ...
import flash.events.SampleDataEvent;
import flash.media.Sound;
import flash.utils.ByteArray;
public class DualSound extends Sound {
private var sa:Sound;
private var sb:Sound;
public function DualSound(a:Sound, b:Sound) {
super();
sa = a;
sb = b;
addEventListener(SampleDataEvent.SAMPLE_DATA, handleSampleData);
}
private function handleSampleData(e:SampleDataEvent):void {
var ba:ByteArray, bb:ByteArray;
ba = new ByteArray();
bb = new ByteArray();
sa.extract(ba, 8 << 10, e.position);
sb.extract(bb, 8 << 10, e.position);
ba.position = 0;
bb.position = 0;
while(ba.bytesAvailable > 0 && bb.bytesAvailable > 0) {
e.data.writeFloat((ba.readFloat() + bb.readFloat()) / 2);
}
if(ba.bytesAvailable > 0) {
e.data.writeBytes(ba, ba.position, ba.bytesAvailable);
} else if(bb.bytesAvailable > 0) {
e.data.writeBytes(bb, bb.position, bb.bytesAvailable);
}
}
}