Запись / сохранение микрофона AS3 работает, воспроизведение PCM во флэш-памяти с двойной скоростью - PullRequest
4 голосов
/ 29 апреля 2010

У меня есть рабочий сценарий записи микрофона в AS3, который я смог успешно использовать для сохранения файлов .wav на сервер через AMF. Эти файлы прекрасно воспроизводятся на любом аудиоплеере без каких-либо странных эффектов.

Для справки, вот что я делаю для захвата ByteArray микрофона: (внутри класса 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);
}

Это работает без проблем. После завершения записи я могу взять переменную _rawData и запустить ее через класс WavWriter и т. Д.

Однако, если я запускаю этот же ByteArray в качестве звука, используя следующий код, который я адаптировал из Adobe Cookbook: (в классе под названием 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);
  }
}

Аудио файл воспроизводится с удвоенной скоростью! Я проверил битрейт записи и тому подобное, и я почти уверен, что все они верны, и я попытался изменить размер буфера и любые другие числа, о которых я мог подумать. Может ли это быть моно против стерео?

Надеюсь, мне было достаточно ясно, спасибо!

Ответы [ 2 ]

8 голосов
/ 29 апреля 2010

Проблема в том, что ByteArray должен содержать данные для обоих каналов (левого и правого), одно значение сразу за другим. Таким образом, , если ваша запись моно , ваш код должен быть таким:

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

Если это стерео, вам нужно будет соответственно отрегулировать.

3 голосов
/ 24 января 2011

Я проверял это.
Вы должны убедиться, что частота микрофона составляет 44 кГц:
_microphone.rate = 44;
Это должно звучать правильно.

Я использовал:

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