问题
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:
recording the first .3 seconds with mic.gain = 0; then setting mic.gain = 50;
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