2012-01-21 2 views
2

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

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

Великий никто не может помочь .. !!! по крайней мере, дайте мне знать, что делать .. если я хочу называть getMaxAmplitue() через каждые 0,5 сек. внутри обработчика, как я могу получить чтение непрерывно .. ?? – arun

ответ

0

вы можете использовать таймер для вызова getMaxAmplitue() после каждого .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()); 
     } 
    } 

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