Как воспроизвести звук из массива байтов микрофона в AS3?

Я пытаюсь воспроизвести звук из ByteArray, захваченный с микрофона, и я ожидаю услышать звук с микрофона, но я получаю только случайный искаженный звук. Это код, который я использую сейчас:

var playBa:ByteArray;

var player:Sound = new Sound();
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playMic);
sound.play();

var mic:Microphone = Microphone.getMicrophone();
mic.gain = 100;
mic.rate = 44;
mic.setSilenceLevel(0, 4000);
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, onMicSample);

function playMic(e:SampleDataEvent):void
{
    if (playBa != null) e.data.writeBytes(playBa, 0, playBa.length);
}

function onMicSample(e:SampleDataEvent):void
{
    playBa = e.data;
    playBa.position = 0;
    player.play();
}

И после нескольких секунд искаженных звуков вот что я получил в окне вывода:

RangeError: Error #2004: One of the parameters is invalid.
at flash.media::Sound/play()
at vclass_fla::MainTimeline/onMicSample()

Пожалуйста помогите. Я совершенно новичок в AS3 и здесь. Любая помощь высоко ценится. Спасибо.


person O'Dell Obrien    schedule 18.02.2013    source источник


Ответы (2)


Некоторые микрофоны очень чувствительны. Вам необходимо настроить умеренные параметры, как показано ниже. Кроме того, если динамики ближе к микрофону, звук зацикливается.

var myMic:Microphone = Microphone.getMicrophone(); // detect microphone
myMic.gain = 50;
myMic.setUseEchoSuppression(true);
myMic.setLoopBack(true);
myMic.setSilenceLevel(50, 1000);

Чтобы узнать больше о захвате звука, попробуйте это: /а>

person Rajneesh Gaikwad    schedule 18.02.2013
comment
Спасибо за код, но результат тот же. Мне нужно получить массив байтов с микрофона, а затем отправить его на сервер, используя тот же массив байтов, воспроизвести массив байтов в классе Sound. - person O'Dell Obrien; 18.02.2013
comment
Кажется, я показал, как создается звуковой объект. Посмотрите на код выше. player — это звуковой объект. - person O'Dell Obrien; 18.02.2013
comment
что это за звук.addEventListener(SampleDataEvent.SAMPLE_DATA, playMic);? Я думаю, что это должен быть плеер вместо звука. Сначала проверьте свой код. - person Rajneesh Gaikwad; 18.02.2013
comment
Ах да... это была моя ошибка... хорошо, подождите, здесь все правильно... я просто опечатался в коде выше. Пробую сначала по ссылке которую вы даете. - person O'Dell Obrien; 18.02.2013

Проблема в том, что для события выборки данных требуются блоки от 2048 до 8192 выборок. Если сэмплы записаны микрофоном при вызове "playMic" во время выполнения выбрасывается "RangeError: Error #2004...".

function playMic(event:SampleDataEvent):void
{
    trace("sample event");
    for (var ii:uint = 0; ii < 8192 && playBa.bytesAvailable > 0 ; ii++)
    {
        var n1:Number = playBa.readFloat();
        //trace(n1);
        event.data.writeFloat(n1);
        event.data.writeFloat(n1);
        if(playBa.bytesAvailable == 0)
        {
            trace("data_finished");
            break;
        }
    }

}
person Federico    schedule 24.02.2016