Поигрался с примером
Tinic Uro по поводу новых методов класса Sound, в частности, extract():
function extract(target:ByteArray,
length:Number,
startPosition:Number = -1 ):Number;
- target - ByteArray, в который помещаются извлеченные сэмплы (samples);
- length - количество сэмплов. Сэмпл содержит левый и правый каналы, каждый из которых представляет числа с плавающей точкой.
- startPosition - позиция, с которой начнется извленение. Если она не указана, то извлечение будет идти с начала.
- extract() - возвращает количество сэмплов, но оно может быть меньше запрошенной длины в самом конце звука.
Вот немного переделанный пример того, как можно наложить два звука друг на друга:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.media.*;
import flash.net.URLRequest;
import flash.utils.ByteArray;
public class SoundTest extends Sprite
{
private var mp3sound0:Sound = new Sound();
private var mp3sound1:Sound = new Sound();
private var dynamicSound:Sound = new Sound();
private var samples0:ByteArray = new ByteArray();
private var samples1:ByteArray = new ByteArray();
public function SoundTest()
{
mp3sound0.addEventListener(Event.COMPLETE, loadComplete0);
mp3sound0.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
//загрузка первого файла
mp3sound0.load(new URLRequest("sound0.mp3"));
}
private function loadComplete0(event:Event):void
{
mp3sound1.addEventListener(Event.COMPLETE, loadComplete1);
mp3sound1.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
//загрузка второго файла по событию загрузки первого
mp3sound1.load(new URLRequest("sound1.mp3"));
}
private function onIOError(e:IOErrorEvent):void
{
trace(e.text);
}
private function loadComplete1(event:Event):void
{
//начало динамического наложения звуков
dynamicSound.addEventListener("samplesCallback",samplesCallback);
dynamicSound.play();
}
private function samplesCallback(event:SamplesCallbackEvent):void
{
//установка массивов на нулевую позицию
samples0.position = 0;
samples1.position = 0;
var len:Number = 1000;
//извлечение сэмплов в массивы
mp3sound0.extract(samples0, len);
mp3sound1.extract(samples1, len);
//установка массивов на нулевую позицию
samples0.position = 0;
samples1.position = 0;
for (var c:int = 0; c < len; c++)
{
//получение значение каналов и их сложение
var left:Number = samples0.readFloat() + samples1.readFloat();
var right:Number = samples0.readFloat() + samples1.readFloat();
//запись значений в объект динамического звука
dynamicSound.samplesCallbackData.writeFloat(left);
dynamicSound.samplesCallbackData.writeFloat(right);
}
}
}
}