registrazione AS3 microfono / opere di risparmio, in-Flash riproduzione PCM a doppia velocità
-
02-10-2019 - |
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!
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);
}
}