Domanda

Ho uno script di registrazione microfono lavora in AS3 che sono stato in grado di utilizzare con successo per salvare i file .wav a un server tramite AMF. Questi file da riprodurre bene in qualsiasi lettore audio senza effetti strani.

Per riferimento, qui è quello che sto facendo per catturare ByteArray del microfono: (all'interno di una classe chiamata AudioRecorder)

public function startRecording():void {
_rawData = new ByteArray();
_microphone
 .addEventListener(SampleDataEvent.SAMPLE_DATA,_samplesCaptured, false, 0, true);
}

private function _samplesCaptured(e:SampleDataEvent):void {
  _rawData.writeBytes(e.data);
}

Questo funziona senza problemi. Dopo la registrazione è completa posso prendere la variabile _rawData ed eseguirlo tramite una classe WavWriter, ecc.

Tuttavia, se corro questo stesso ByteArray come un suono utilizzando il seguente codice che ho adattato dal libro di cucina adobe: (in una classe denominata WavPlayer)

public function playSound(data:ByteArray):void {
  _wavData = data;
  _wavData.position = 0;
  _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, _playSoundHandler);
  _channel = _sound.play();
  _channel
    .addEventListener(Event.SOUND_COMPLETE, _onPlaybackComplete, false, 0, true);
}

private function _playSoundHandler(e:SampleDataEvent):void {
  if(_wavData.bytesAvailable <= 0) return;
  for(var i:int = 0; i < 8192; i++) {
    var sample:Number = 0;
    if(_wavData.bytesAvailable > 0) sample = _wavData.readFloat();
    e.data.writeFloat(sample);
  }
}

Il file audio viene riprodotto a velocità doppia! Ho controllato registrando bitrate e tali e sono abbastanza sicuro che quelli sono tutti corretti, e ho provato a cambiare la dimensione del buffer e qualsiasi altro numero che potrei pensare. Potrebbe essere un mono vs cosa stereo?

Spero di essere stato abbastanza chiaro qui, grazie!

È stato utile?

Soluzione

Il problema è che il ByteArray deve contenere i dati per entrambi i canali (destro e sinistro), un valore subito dopo l'altro. Così, Se la registrazione è mono , il codice dovrebbe essere questo:

for(var i:int = 0; i < 8192; i++) {
    var sample:Number = 0;
    if(_wavData.bytesAvailable > 0) sample = _wavData.readFloat();
        e.data.writeFloat(sample);
        e.data.writeFloat(sample);
}

Se è stereo, sarà necessario regolare di conseguenza.

Altri suggerimenti

ho testato.
È necessario assicurarsi che il tasso del microfono è a 44kHz:
_microphone.rate = 44;
Questo dovrebbe suonare destra.

Ho usato:

    private function playSound(data:ByteArray):void
    {
        rawData = data;
        rawData.position = 0;
        var sound:Sound = new Sound();
        sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playSoundHandler);
        var channel:SoundChannel = sound.play();
        channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete, false, 0, true);
    }

    private function playSoundHandler(e:SampleDataEvent):void
    {
        if(rawData.bytesAvailable <= 0)
        {
            return;
        }
        for(var i:int = 0; i < 8192; i++)
        {
            var sample:Number = 0;
            if(rawData.bytesAvailable > 0)
            {
                sample = rawData.readFloat();
            }
            e.data.writeFloat(sample);
            e.data.writeFloat(sample);
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top