2012-01-17 7 views
0

Я знаю, как записывать аудио в ActionScript 3. Но можно ли что-то вырезать из финального звукового файла в actionscript?Резка звука в actionscript

Моим вариантом использования является то, что пользователь может перейти к определенной точке в звуковом файле (я могу управлять этим) и начать запись оттуда (в основном перезаписывая остальную часть файла).

Возможно ли это в ActionScript 3. Если да, то как?

спасибо.

UPDATE:

Это код, который я использовал, и это работает, но старая запись получает разбили вниз. Я не знаю почему. «selectedTime» - миллисекундное значение времени, выбранного пользователем в графическом представлении волны; 44100 - это моя частота выборки.

existingByte = new ByteArray(); 
var extract:Number = Math.floor ((selectedTime)*44.1); 
sound.extract(existingByte, extract); 

mic.recordData(existingByte); 

// in the mic class: 
public function recordData(existingByteArray:ByteArray=null):void { 
    if(existingByteArray == null) { 
     raw = new ByteArray(); 
    } else { 
     raw = existingByteArray; 
     raw.position = raw.length; 
    } 
    mic.addEventListener(SampleDataEvent.SAMPLE_DATA, dataHandler);   
} 

private function dataHandler(event:SampleDataEvent):void { 
    try { 
     raw.writeBytes(event.data);    
    } catch(e) { 
     this.stopRecording(); 
    } 
} 

ответ

0

Да. Когда вы получаете байты из аудиопотока, вы добавляете их в главный буфер. Если вы хотите сделать запись, как запись. Вам нужно знать смещение в главном буфере, куда вы хотите вбить. Поэтому вместо того, чтобы писать в буфер с самого начала, вы должны писать в буфер из смещения, которое пользователь нажал. Вам нужно будет связать указатель мыши со смещением в главном буфере. Затем, когда вы получаете новый звук, просто перезапишите значения в этом буфере. Если вы хотите получить удар, чтобы он только перезаписывал небольшую часть аудио. Вам понадобится конечная точка в главном буфере, где также прекратится запись новых данных. Пользователь может выделить раздел аудио для ввода/вывода точек.

Вам понадобится использовать ByteArrays для двух буферов. Вы можете извлечь необработанные байты из Sound с помощью Sound.extract(). Другие источники сырья аудио могут быть применены и здесь:

var master : ByteArray; // assume this is loaded with some audio 

public function punchIn(startLocation : index, sound : Sound) : void { 
    sound.extract(master, sound.bytesTotal, startLocation); 
} 

Изменяя параметр длины вы можете сделать удар в и выбивать функцию.

+0

Хорошо, спасибо. Я попробую и обязательно вернусь с некоторым примером кода :) – shredding

+0

Это круто, но у меня есть одна оставшаяся проблема. Он отлично работает, и мне удалось сделать разрез. Я использую мастер и передаю его обратно в класс микрофона и добавляю новую запись в конце. Повторите мой вопрос еще раз, я добавил код. Несмотря на то, что это работает, высота основной записи значительно ниже. Я вычисляю длину следующим образом: sound.length * 44.1 (44.1 - моя ставка). У вас есть идея, почему это происходит. Спасибо вам большое! – shredding

+0

У вас есть несоответствие скорости дискретизации между входом микрофона и файлом образца, который вы загружаете в буфер. Если ваш звук равен 44.1khz, ваш микрофон должен быть 44.1khz. Я почти уверен, что микрофон не отбирается в 44.1khz. Таким образом, вам нужно будет уменьшить буфер 44.1khz до той же частоты дискретизации микрофона. Это цикл по звуковым необработанным байтам и извлечение каждого N байта в мастер. indexStep = 44.1khz/16khz. Возможно, вам придется накапливать ошибки округления и принимать дополнительный байт каждые X секунд. Держите поплавок и складывайте остатки, если (acc> 1.0) {acc = 1.0; sampleExtraByte()} – chubbsondubs

Смежные вопросы