2010-04-29 6 views
4

J'ai un script d'enregistrement de micro en fonctionnement dans AS3 que j'ai pu utiliser avec succès pour enregistrer des fichiers .wav sur un serveur via AMF. Ces fichiers sont bien lus dans n'importe quel lecteur audio sans effets étranges.Enregistrement/enregistrement d'un microphone AS3 fonctionne, lecture in-flash PCM double vitesse

Pour référence, voici ce que je fais pour capturer le ByteArray du micro: (au sein d'une classe appelée 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); 
} 

Cela fonctionne sans problème. Une fois l'enregistrement terminé, je peux prendre la variable _rawData et l'exécuter dans une classe WavWriter, etc.

Cependant, si je lance ce même ByteArray sous forme de son en utilisant le code suivant que j'ai adapté du livre de cuisine adobe: (dans une classe appelée 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); 
    } 
} 

Le fichier audio joue à double vitesse! J'ai vérifié les débits d'enregistrement et je suis sûr que tout est correct, et j'ai essayé de changer la taille de la mémoire tampon et d'autres nombres auxquels je pouvais penser. Pourrait-il être une chose mono vs stéréo?

Espérons que j'étais assez clair ici, merci!

+0

Vous devez coller à l'étiquette "actionscript-3" pour les questions AS3. C'est ce qui est couramment utilisé. – ktdrv

Répondre

8

Le problème est que le ByteArray doit contenir des données pour les deux canaux (gauche et droite), une valeur immédiatement après l'autre. Ainsi, si votre enregistrement est mono, votre code devrait être ceci:

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

Si elle est stéréo, vous devrez ajuster en conséquence.

+0

Donc, c'était une chose stéréo/mono! Je n'ai pas pensé à écrire deux fois, merci! – Lowgain

3

Je l'ai testé.
Vous devez vous assurer que la fréquence du microphone est de 44 kHz:
_microphone.rate = 44;
Cela devrait sonner correctement.

J'utilisé:

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