AS3 click sound at the start of recording

自闭症网瘾萝莉.ら 提交于 2020-01-14 03:23:12

问题


I'm currently recording sound and storing the byte array for playback and subsequent encoding to mp3.

Unfortunately though I am getting a click sound at the very beginning of the recording.

I have attempted a couple of methods to try to eliminate this such as:

  1. recording the first .3 seconds with mic.gain = 0; then setting mic.gain = 50;

  2. clearing the byteArray after the first .3 seconds then continuing to write the bytearray (in effect deleting the first .3 seconds of the recording.)

Neither of those methods has stopped the click being added.

Would anyone have an idea how I can prevent the click from being added?

Here is my recording/storing code:

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:


Though I can't reproduce the click, I think it might be induced by a sharp increase of sound volume at the beginning of the recording. So it might be possible to eliminate the effect by increasing the volume smoothly. Something like this:

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

Hope this helps.



来源:https://stackoverflow.com/questions/8518778/as3-click-sound-at-the-start-of-recording

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!