Мне нужно больше информации о sound.extract()
Мне нужно немного поработать над звуком. Я нашел пример в справке Adobe:
var sourceSnd:Sound = new Sound();
var outputSnd:Sound = new Sound();
var urlReq:URLRequest = new URLRequest("test.mp3");
sourceSnd.load(urlReq);
sourceSnd.addEventListener(Event.COMPLETE, loaded);
function loaded(event:Event):void
{
outputSnd.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
outputSnd.play();
}
function processSound(event:SampleDataEvent):void
{
var bytes:ByteArray = new ByteArray();
sourceSnd.extract(bytes, 4096);
event.data.writeBytes(upOctave(bytes));
}
function upOctave(bytes:ByteArray):ByteArray
{
var returnBytes:ByteArray = new ByteArray();
bytes.position = 0;
while(bytes.bytesAvailable > 0)
{
returnBytes.writeFloat(bytes.readFloat());
returnBytes.writeFloat(bytes.readFloat());
if (bytes.bytesAvailable > 0)
{
bytes.position += 8;
}
}
return returnBytes;
}
Он сказал:
target:ByteArray — A ByteArray object in which the extracted sound samples are placed.
length:Number — The number of sound samples to extract. A sample contains both the left and right channels — that is, two 32-bit floating-point values.
Я предлагаю
returnBytes.writeFloat(bytes.readFloat());
returnBytes.writeFloat(bytes.readFloat());
Необходимо записать значение левого канала и значение правого канала.
bytes.position += 8
Уменьшите семпл, чтобы звук воспроизводился быстрее. Я попытался изменить значение до 4. Скорость замедлилась до 2, и я только получил шум, почему? Другие значения, например 16 или выше, не выводят звук. Зачем? Как сделать различные звуковые эффекты только одним значением с плавающей запятой?
Мне нужно больше информации, чтобы понять мою работу, пожалуйста, помогите.
Обновление: я немного изменил функцию upOctave(), теперь можно настроить скорость.
function upOctave(bytes:ByteArray):ByteArray
{
var returnBytes:ByteArray = new ByteArray();
bytes.position = 0;
var position:int = 0;
var speed:Number = 0.75;
while(bytes.bytesAvailable > 0)
{
if (bytes.bytesAvailable > 0)
{
bytes.position = int(speed*position)*8;
}
position++;
if(bytes.bytesAvailable>0){
returnBytes.writeFloat(bytes.readFloat());
returnBytes.writeFloat(bytes.readFloat());
}
}
return returnBytes;
}
1 ответ
Короче, bytes.position += 8;
не означает, что Playrate.
4 байта на число с плавающей запятой и два канала. Двигайтесь, как показано на рисунке ниже.
8 byteArray - это 1 набор. Другими словами, выборка.
4byte 4byte
[ L ][ R ] [ L ][ R ] [ L ][ R ] [ L ][ R ] ...
1 2 3 4
L, R 32 поплавок. Непрерывные данные между -1 и 1. как функция греха.
Создать форму волны, вы можете контролировать звук. Прямая волна, пилообразная волна, треугольная волна, синусоида, шумовая волна... В конечном итоге звук зависит от формы волны.
Если вы хотите настроить скорость воспроизведения, прочитайте эту статью: http://www.kelvinluck.com/2008/11/first-steps-with-flash-10-audio-programming/