AS3 щелчок в начале записи - PullRequest
1 голос
/ 15 декабря 2011

В настоящее время я записываю звук и сохраняю массив байтов для воспроизведения и последующего кодирования в mp3.

К сожалению, хотя я получаю звук щелчка в самом начале записи.

Я попытался устранить это несколькими способами, такими как:

  1. запись первых 0,3 секунд с mic.gain = 0;затем устанавливая mic.gain = 50;

  2. , очищая byteArray через первые 0,3 секунды, затем продолжая записывать байтовый массив (фактически удаляя первые 0,3 секунды записи.)

Ни один из этих методов не остановил добавление клика.

Кто-нибудь может представить, как я могу предотвратить добавление клика?

Здесьмой код записи / хранения:

public var mic:Microphone = Microphone.getMicrophone();
public var micSilence:uint;
private var soundBytes:ByteArray = new ByteArray();
private var soundBA:ByteArray = new ByteArray();

mic.gain = 50;
mic.setSilenceLevel(1, 2000);
mic.rate = 44;
Security.showSettings("2");
mic.setLoopBack(false);
mic.setUseEchoSuppression(false);

private function startRecordingAfterCountdown():void {      
    mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);            
}

private function micSampleDataHandler(event:SampleDataEvent):void {     
    while (event.data.bytesAvailable){
        var sample:Number = event.data.readFloat();
        soundBytes.writeFloat(sample);
    }
}

private function stopRecord():void {        
    mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);     
    soundBytes.position = 0;
    soundBA.clear();
    soundBA.writeBytes(soundBytes);
    soundBA.position = 0;
    soundBytes.clear();

    var newBA:ByteArray = new ByteArray();
    newBA.writeBytes(soundBA);
    recordingsArray[0] = newBA;     
}

1 Ответ

3 голосов
/ 15 декабря 2011

Хотя я не могу воспроизвести щелчок, я думаю, что это может быть вызвано резким увеличением громкости звука в начале записи.Таким образом, можно устранить эффект путем плавного увеличения громкости.Примерно так:

// the amount of volume increasing time in ms
public static const VOLUME_INC_TIME_MS:uint = 200;
// in bytes
public static const VOLUME_INC_BYTES:uint = VOLUME_INC_TIME_MS * 44.1 * 4;

private function micSampleDataHandler(event:SampleDataEvent):void
{
    var bytesRecorded:uint = soundBytes.length;
    while( event.data.bytesAvailable )
    {
        var sample:Number = event.data.readFloat();
        if( bytesRecorded < VOLUME_INC_BYTES )
        {
            // using linear dependence, but of course you can use a different one
            var volume:Number = bytesRecorded / VOLUME_INC_BYTES;
            soundBytes.writeFloat(sample * volume);
            bytesRecorded += 4;
        }else
        {
            soundBytes.writeFloat(sample);
        }
    }
}

Надеюсь, это поможет.

...