2012-01-21 1 views
2

音を録音するためにMediaRecorderを使い、音の変化に伴ってバーを上下に動かしました。私はまだ適切な解決策を確立していません。助言がありますか。??編集:私はそれに私の手を得ることができた今問題は、私はそれが私は仕事をした後、バーの動きを表示するためにその値を使用しようとしている後にハンドラを使用して振幅を見つけるためにgetMaxAmplitude() getMaxAmplitude()確かに値がゼロになっています。ここで間違っている可能性があります。ここではコードの一部 ます。public void実行(){ 試みは、{ある私は、音を録音するために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

偉大な誰も助けるべきではありません.. !!! atleast私は何をすべきかを教えてください.5秒ごとにgetMaxAmplitue()を呼び出す場合。ハンドラーの中でどのように私は連続的に読むことができますか? – arun

答えて

0
あなたは

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秒後にgetMaxAmplitue()を呼び出すためにタイマーを使用することができます

タイマーは0.5秒ごとに結果を得る。

関連する問題