flash - 录音开始时AS3的喀哒声

标签 flash actionscript-3 audio bytearray

我目前正在录制声音,并存储字节数组以进行播放和随后的mp3编码。

不幸的是,尽管在录音的一开始我就得到了咔嗒声。

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

  • 以mic.gain = 0记录前0.3秒;然后设置mic.gain = 50;
  • 在前.3秒后清除byteArray,然后继续写入字节数组(实际上是删除记录的前.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;     
    }
    

    最佳答案

    尽管我无法重现咔嗒声,但我认为它可能是由于录制开始时声音的急剧增加所引起的。因此,可以通过平稳地增大音量来消除这种影响。像这样:

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

    希望这可以帮助。

    关于flash - 录音开始时AS3的喀哒声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8518778/

    相关文章:

    c# - 如何连接 Youtube 视频(Flash Player?)以减慢播放速度?

    apache-flex - 如何使用 ActionScript 通过 Socket 类(或 XMLSocket)传输视频?

    flash - 如何在 AS3 中创建分享按钮

    html - 在 Flash 页面中编辑分辨率

    python - 使用 ByteArrays 解压缩 Zlib 字符串

    actionscript-3 - Flex/air mobile - 显示 SD 卡中的所有 mp3 歌曲以及 id3 信息和海报图像

    apache-flex - 访问 List 中的 itemRenderer

    ios - 如何使用iPhone麦克风输入进行开关以计数轮转?

    flash - 在Flash中无间隔播放连续声音

    matlab - 使用MATLAB进行音频过滤的奇怪问题