Подробная информация о формате as3 Sound.extract()?

Используя метод звукового объекта.extract(), можно получить несжатые звуковые данные в виде ByteArray. В каком формате извлекаются звуковые данные? Пользовательский внутренний формат или установленный формат? Тип Endian?

Я хотел бы иметь возможность загружать звуковые данные непосредственно в массив byteArray и воспроизводить звук из этих данных (минуя шаг 1 ниже).

Вот мои эксперименты до сих пор:

Шаг 1. Здесь я загружаю звук, извлекаю содержимое данных и сохраняю его на диск:

private var sound:Sound;
private var byteArray:ByteArray;

// loading a sound...
private function init():void {
    sound = new Sound();            
    sound.addEventListener(Event.COMPLETE, onComplete);
    sound.load(new URLRequest('short.mp3'));
}

// saving it to disc...
private function onComplete(e:Event):void {
    byteArray = new ByteArray();
    sound.extract(byteArray, 100000000);            
    byteArray.position = 0;
    var file:FileReference = new FileReference();
    file.save(byteArray, 'short.data');             
}

Шаг 2. Здесь я загружаю данные с диска и передаю воспроизведение нового звукового объекта с этими данными:

private var sound:Sound;
private var byteArray:ByteArray;

// loading a sound...
private function init():void {

    file = new FileReference();
    file.addEventListener(Event.COMPLETE, onLoaded);
    file.addEventListener(Event.SELECT, onSelected);
    file.browse();

}

private function onSelected(e:Event):void {
    file.load();
}

private function onLoaded(e:Event):void {
    trace('loaded');
    trace(file.data.length);
    byteArray = file.data;

    sound2 = new Sound();
    sound2.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);     
    sound2.play();      
}   

private function onSampleData(e:SampleDataEvent):void {
    trace(e.position);
    for (var i:int = 0; i < 2048; i++) {
        var left:Number = byteArray.readFloat();
        var right:Number = byteArray.readFloat();               
        e.data.writeFloat(left * 0.2);
        e.data.writeFloat(right * 0.2);
    }
}

Я хотел бы иметь возможность выполнить этот второй шаг (загрузка данных с диска и подача воспроизведения звукового объекта) с помощью утилиты внешнего конвертера (sox или что-то).

/ Джонас

1 ответ

Решение

Это должны быть стандартные 32-битные числа с плавающей запятой, по одному на канал на выборку. Так что я бы попробовал -e с плавающей точкой для sox, хотя я не пробовал, но я бы сделал это с определенным уровнем уверенности...:) Плавания независимы от байтов, я считаю...

Другие вопросы по тегам