Флэш-запись и воспроизведение воспроизводит в 2 раза быстрее - PullRequest
0 голосов
/ 15 октября 2011

Я делаю простое приложение AS3, которое будет записывать звук с микрофона, а затем воспроизводить его с использованием данных ByteArray.

Я создал приложение, оно записывает, но когда я пытаюсь воспроизвести его, оно воспроизводится в 2 раза быстрее ...

Интересно то, что раньше все было хорошо, а теперь быстрее ... И даже когда я запускаю старый файл, у него есть код, который работал на 100%, прежде чем он теперь быстрее ...

Вот код:

import flash.media.*;
import flash.events.*;
import flash.utils.ByteArray;

var ch:SoundChannel;
var soundBytes:ByteArray = new ByteArray();
var soundO:ByteArray = new ByteArray();
var sound:Sound= new Sound();


var mic:Microphone = Microphone.getMicrophone();
var recMode:Boolean = false;
var playMode:Boolean = false;

function init()
{
    mic.codec = "Speex";
    mic.setSilenceLevel(0);
    mic.gain = 50;
    mic.rate = 44;
}

function startRecord():void
{
    mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);
}
function stopRecord():void
{
    mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);
    soundBytes.position = 0;
    soundO.length = 0;
    soundO.writeBytes(soundBytes);
    soundO.position = 0;
    soundBytes.length = 0;
}

function micSampleDataHandler(event:SampleDataEvent):void
{
    while (event.data.bytesAvailable)
    {
        var sample:Number = event.data.readFloat();
        soundBytes.writeFloat(sample);
    }
}

function playSound():void
{
    soundO.position = 0;
    sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playbackSampleHandler);
    ch = sound.play();
    ch.addEventListener(Event.SOUND_COMPLETE,onSC);
}
function stopSound():void
{
    sound.removeEventListener(SampleDataEvent.SAMPLE_DATA, playbackSampleHandler);
    ch.stop();
    ch.removeEventListener(Event.SOUND_COMPLETE,onSC);
}
function onSC(evt:Event):void
{
    stopSound();
    soundO.position = 0;
    playMode = ! true;
    rec_btn.visible = true;
    rec_btn2.visible = false;
    play_btn.visible = true;
    play_btn2.visible = false;
}
function playbackSampleHandler(event:SampleDataEvent):void
{
    for (var i:int = 0; i < 8192; i++)
    {
        if (soundO.bytesAvailable < 4)
        {
            break;
        }
        var sample:Number = soundO.readFloat();
        event.data.writeFloat(sample);
        event.data.writeFloat(sample);


    }
}

rec_btn.buttonMode = rec_btn2.buttonMode = play_btn.buttonMode = play_btn2.buttonMode = true;
function showPlayUI()
{
    play_btn.visible = true;
}
function hidePlayUI()
{
    play_btn2.visible = false;
    rec_btn2.visible = false;
}
rec_btn.addEventListener(MouseEvent.CLICK,onRecord);
rec_btn2.addEventListener(MouseEvent.CLICK,onRecord);
play_btn.addEventListener(MouseEvent.CLICK,onPlay);
play_btn2.addEventListener(MouseEvent.CLICK,onPlay);


function onRecord(evt:MouseEvent=null):void
{
    if (playMode)
    {
        playMode = ! true;
        play_btn2.visible = false;
        play_btn.visible = true;
        stopSound();
    }


    if (! recMode)
    {
        recMode = true;
        rec_btn.visible = false;
        rec_btn2.visible = true;
        play_btn2.visible = false;
        startRecord();
    }
    else
    {
        recMode = ! true;
        rec_btn.visible = true;
        rec_btn2.visible = false;
        play_btn2.visible = false;
        stopRecord();
        showPlayUI();
    }
}
function onPlay(evt:MouseEvent=null):void
{
    if (recMode)
    {
        recMode = false;
        rec_btn.visible = true;
        rec_btn2.visible = false;
        stopRecord();
    }

    if (! playMode)
    {
        playMode = true;
        rec_btn2.visible = false;
        play_btn2.visible = true;
        play_btn.visible = false;
        playSound();
    }
    else
    {
        playMode = ! true;
        rec_btn2.visible = false;
        play_btn2.visible = false;
        play_btn.visible = true;
        stopSound();
    }
}


hidePlayUI();
init();

Как вы можете видеть, скорость кодирования составляет 44, что является скоростью приема ...

Я проверял это на Vista и на XP на моем ПК,и на обоих это быстрее ...

Вот URL: Запись и воспроизведение

Ответы [ 2 ]

1 голос
/ 15 октября 2011

Я думаю, вам не следует вызывать это дважды в вашем файле selectionHandler.

    event.data.writeFloat(sample);
    event.data.writeFloat(sample);
0 голосов
/ 17 октября 2011

Проблема была в кодеке Speex, поскольку он по-разному кодирует микрофон, поэтому, когда вы пытаетесь использовать его уровни в качестве Float, он записывает его как кодированный звук, а не как оригинальный ...

Двойные линии в порядке, так и должно быть ...

ByteArray не работает нормально с кодеком Speex, вместо него используйте кодек по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...