AS3 - длина записи тихого звука отличается от длины записи звука - PullRequest
0 голосов
/ 08 марта 2012

Я испытываю странную проблему и спрашиваю себя, есть ли у кого-нибудь представление о том, что происходит.

В ActionScript 3 я использую микрофон для записи 13-секундного аудиоклипа. У меня для mic.setSilenceLevel установлено значение 0, поэтому данные постоянно отбираются.

Нажмите кнопку Пуск, чтобы запустить таймер и записать байтовые данные с микрофона. 13 секунд спустя таймер останавливается, и я записываю данные в массив byteArray, который затем кодируется в mp3.

Если я записываю 13 секунд без звука, mp3-файл имеет длину 12,251 секунды. Если я записываю 13 секунд звука, длина файла mp3 составляет 12,512 секунд.

Есть идеи, почему?

mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);

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


private function stopRecord():void {

mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);

var START_BYTES:uint = 0;

soundBytes.position = 0;

soundBA.clear();
soundBA.position = 0;

//insert the .2 seconds of silence to the new sound at the beginning

    for (var i:int = 0; i<4096; i++) { 
    soundBA.writeFloat(0); 
    soundBA.writeFloat(0); 
    } 

soundBA.writeBytes(soundBytes, START_BYTES);

soundBA.position = 0;


}
...