AS3在录制开始时单击声音

时间:2011-12-15 10:42:55

标签: flash actionscript-3 audio bytearray

我正在录制声音并存储字节数组以供播放和后续编码到mp3。

不幸的是,虽然我在录制的最开始时听到了咔嗒声。

我尝试了几种方法来尝试消除这种情况,例如:

  1. 用mic.gain = 0记录第一个.3秒;然后设置mic.gain = 50;

  2. 在第一个.3秒后清除byteArray,然后继续写入bytearray(实际上删除了录制的第一个.3秒。)

  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 个答案:

答案 0 :(得分:3)

虽然我无法再现咔嗒声,但我认为可能是录音开始时音量急剧增加所致。因此可以通过平滑地增加音量来消除这种影响。像这样:

// 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);
        }
    }
}

希望这有帮助。