-2

ユーザーの声から振幅を検出する方法は? ユーザーが話すかどうかを検出するだけです。AudioRecorder、MediaRecorder、Audio Capture の違いは何ですか? 完全な説明とコードを教えてください

チュートリアルからこのクラスを試しましたが、「mRecorder.prepare():」にエラーがあります

import android.media.MediaRecorder;

 public class SoundMeter {
    static final private double EMA_FILTER = 0.6;

    private MediaRecorder mRecorder = null;
    private double mEMA = 0.0;

    public void start() {
            if (mRecorder == null) {
                    mRecorder = new MediaRecorder();
                    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    mRecorder.prepare();
                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mRecorder.setOutputFile("/dev/null"); 

                mRecorder.start();
                mEMA = 0.0;
            }
    }

    public void stop() {
            if (mRecorder != null) {
                    mRecorder.stop();       
                    mRecorder.release();
                    mRecorder = null;
            }
    }

    public double getAmplitude() {
            if (mRecorder != null)
                    return  (mRecorder.getMaxAmplitude()/2700.0);
            else
                    return 0;

    }

    public double getAmplitudeEMA() {
            double amp = getAmplitude();
            mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
            return mEMA;
    }

}

2 回目の試行を更新する

     public class MainActivity extends Activity {


 static final private double EMA_FILTER = 0.6;
private MediaRecorder mRecorder = null;
private double mEMA = 0.0;
TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


      mRecorder = new MediaRecorder();
      mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

      mRecorder.start();
      mEMA = 0.0;


     tv = (TextView) findViewById(R.id.textView1);
    double a = getAmplitude();
    tv.setText(String.valueOf(a));
    new Timer().schedule(new TimerTask() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            down();
        }
    }, 500, 10);

}
public void down() {
    this.runOnUiThread(Update);
}
private Runnable Update=new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        double a = getAmplitude();
        tv.setText(String.valueOf(a));
    }
};


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
public double getAmplitude() {
       if (mRecorder != null)
               return  (mRecorder.getMaxAmplitude());
       else
               return 0;

} }

4

1 に答える 1

1

いくつかのこと:

  1. prepare() ステートメントのに出力形式を設定する必要があります。prepare()のドキュメントから: 後または前にIllegalStateException呼び出された場合にスローしますstart()setOutputFormat()

  2. MediaRecorder.prepare() も IOException をスローします。prepare() を try/catch コンストラクトで囲むことができます。

試す:

if (mRecorder == null) {
    try {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mRecorder.setOutputFile("/dev/null"); 

        mRecorder.prepare();
        mRecorder.start();
        mEMA = 0.0;
    }
    catch (IOException e) {
        //do something with e
    }
}
于 2013-02-21T06:53:19.760 に答える