Я хочу использовать медиаплеер для записи звуков, а затем рассчитать «амплитуду» для перемещения полос вверх и вниз с изменением звука - PullRequest
2 голосов
/ 21 января 2012

Я хочу использовать MediaRecorder для записи звуков, а затем хочу рассчитать «амплитуду» для перемещения полос вверх и вниз с изменением звука. Я пока не нашел правильного решения. какие-либо предложения.?? Отредактировано: мне удалось получить мою руку, теперь проблема в том, что я попытался getMaxAmplitude (), чтобы найти амплитуду, используя Handler, после этого я пытаюсь использовать это значение, чтобы показать движение бара вверх, это не сработало, затем я напечатал значение getMaxAmplitude () конечно, значение оказывается равным нулю. что может быть здесь не так? Вот кусок кода public void run () { попробуй {

            mRecorder.start();
            while (this.mIsRunning) {
                // creating these variables here so that
                // the mode change can be handled
                double amp = getAmplitude();
                Message msg = mHandle.obtainMessage(MY_MSG, amp);
                mHandle.sendMessage(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Message msg = mHandle.obtainMessage(ERROR_MSG,
                    e.getLocalizedMessage() + "");
            mHandle.sendMessage(msg);
        }
        if (mRecorder != null) {
            mRecorder.stop();
            mRecorder.release();
            mRecorder = null;
        }
    }

    public double getAmplitude() {
        if (mRecorder != null) {
            powerDb = 20 * Math.log10(mRecorder.getMaxAmplitude() / 2700.0);
            return (powerDb);
        }

        else {
            return 1;
        }
    }
public Handler mhandle = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MY_MSG:

                // mSplModeTV.setText(" " + msg.obj);
                if (audioEngineFlag == 1) {
                    String s1 = msg.obj.toString();
                    float f = Float.valueOf(s1.trim()).floatValue();
                    Log.v(TAG, "amplitude=" + f); }

1 Ответ

0 голосов
/ 10 января 2013

вы можете использовать таймер для вызова getMaxAmplitue () через каждые 0,5 с

MyTimer tim = new new MyTimer(30000,500);;
   mRecorder.start();
tim.start();
            while (this.mIsRunning) {
                // creating these variables here so that
                // the mode change can be handled
                double amp = getAmplitude();
                Message msg = mHandle.obtainMessage(MY_MSG, amp);
                mHandle.sendMessage(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Message msg = mHandle.obtainMessage(ERROR_MSG,
                    e.getLocalizedMessage() + "");
            mHandle.sendMessage(msg);
        }
        if (mRecorder != null) {
            mRecorder.stop();
            mRecorder.release();
            mRecorder = null;
        }
    }

    public double getAmplitude() {
        if (mRecorder != null) {
            powerDb = 20 * Math.log10(mRecorder.getMaxAmplitude() / 2700.0);
            return (powerDb);
        }

        else {
            return 1;
        }
    }
public Handler mhandle = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MY_MSG:

                // mSplModeTV.setText(" " + msg.obj);
                if (audioEngineFlag == 1) {
                    String s1 = msg.obj.toString();
                    float f = Float.valueOf(s1.trim()).floatValue();
                    Log.v(TAG, "amplitude=" + f); }


public class MyTimer extends CountDownTimer {
        public MyTimer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onFinish() {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTick(long millisUntilFinished) {
            int amplitude = mRecorder.getMaxAmplitude();
            Log.i("AMPLITUDE", new Integer(amplitude).toString());
        }
    }

Вы можете использовать этот обработчик в таймере для получения результата через каждые .5 сек.

...