如何使用getMaxAmplitude - Android

时间:2012-01-15 20:11:58

标签: android media-player media amplitude

我正在开发一款可以使用MediaRecorder和MediaPlayer录制播放音频的应用。我还想显示maxAmplitude的值。我试图使用getMaxAmplitude,但我不能让它工作。它一直返回0.录音机和播放器工作正常(来自developer.android.com)。 有人可以帮助我。 最终我想要显示dB,但我认为一旦我开始工作,我就可以自己做。 我是android / java的新手,所以欢迎每一个帮助。

我的代码

    public class AudioRecordTest extends Activity{
private static final String LOG_TAG = "AudioRecordTest";
protected static final String TAG = null;
private static String mFileName = null;
private RecordButton mRecordButton = null;
private MediaRecorder mRecorder = null;
private PlayButton   mPlayButton = null;
private MediaPlayer   mPlayer = null;
private int currentAmplitude;
public boolean activeThread;


private void onRecord(boolean start) {
    if (start) {
        startRecording();
    } else {
        stopRecording();
    }
}

private void onPlay(boolean start) {
    if (start) {
        startPlaying();
    } else {
        stopPlaying();
        }
}

private void startPlaying() {
    mPlayer = new MediaPlayer();
    try {
        mPlayer.setDataSource(mFileName);
        mPlayer.prepare();
        mPlayer.start();
    } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
}

private void stopPlaying() {
    mPlayer.release();
    mPlayer = null;
}

private void startRecording() {
    if (mRecorder == null) {

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mRecorder.setOutputFile(mFileName);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    }

    try {
        mRecorder.prepare();
    } catch (IOException e) {
        Log.e(LOG_TAG, "prepare() failed");
    }

    mRecorder.start();


}

private void stopRecording() {
    mRecorder.stop();
    mRecorder.release();
    activeThread = true;
    mRecorder = null;
}


public void run() {
    // TODO Auto-generated method stub          
    try {
        activeThread = true;
        while(activeThread){
            Log.i(TAG, "onRun()" );
            Thread.sleep(50);
            threadHandler.sendEmptyMessage(0);

        }               
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

private Handler threadHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {

        currentAmplitude = mRecorder.getMaxAmplitude();
        Log.i(TAG, "handleMessage : MaxAmplitude : "+Integer.toString(currentAmplitude) );


    }

};

class RecordButton extends Button {
    boolean mStartRecording = true;

    OnClickListener clicker = new OnClickListener() {
        public void onClick(View v) {
            onRecord(mStartRecording);
            if (mStartRecording) {
                setText("Stop recording");
            } else {
                setText("Start recording");
            }
            mStartRecording = !mStartRecording;
        }
    };

    public RecordButton(Context ctx) {
        super(ctx);
        setText("Start recording");
        setOnClickListener(clicker);
    }
}

class PlayButton extends Button {
    boolean mStartPlaying = true;

    OnClickListener clicker = new OnClickListener() {
        public void onClick(View v) {
            onPlay(mStartPlaying);
            if (mStartPlaying) {
                setText("Stop playing");
            } else {
                setText("Start playing");
            }
            mStartPlaying = !mStartPlaying;
        }
    };

    public PlayButton(Context ctx) {
        super(ctx);
        setText("Start playing");
        setOnClickListener(clicker);
    }
}

public AudioRecordTest() {
    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
    mFileName += "/audiorecordtest.3gp";
}

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    LinearLayout ll = new LinearLayout(this);
    mRecordButton = new RecordButton(this);
    ll.addView(mRecordButton,
        new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            0));
    mPlayButton = new PlayButton(this);
    ll.addView(mPlayButton,
        new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            0));
    TextView tv = new TextView(this);
    ll.addView(tv,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
    tv.setText(Integer.toString(currentAmplitude));
    setContentView(ll);
}

@Override
public void onPause() {
    super.onPause();
    if (mRecorder != null) {
        mRecorder.release();
        mRecorder = null;
    }

    if (mPlayer != null) {
        mPlayer.release();
        mPlayer = null;
    }
}

}

3 个答案:

答案 0 :(得分:1)

我正在使用此代码。我希望它适合你!

private MediaRecorder _recorder;
private MediaPlayer _player;
private Timer _timer;
private String _path;

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

    _timer = new Timer();
    prepareEvents();
}

public void prepareEvents() {
    try {
        Button recordButton = (Button) findViewById(R.id.buttonRecord);
        Button stopButton = (Button) findViewById(R.id.buttonStop);
        Button playButton = (Button) findViewById(R.id.buttonPlay);

        recordButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    if(_recorder == null) {
                        File downloadFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS);
                        _path = downloadFolder.getAbsolutePath() + "/test1.aac";
                        _recorder = new MediaRecorder();
                        _recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                        _recorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
                        _recorder.setAudioSamplingRate(48000);
                        _recorder.setAudioEncodingBitRate(96000);
                        _recorder.setAudioChannels(2);
                        _recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
                        _recorder.setOutputFile(_path);
                        _recorder.prepare();
                        _recorder.start();

                        _timer.schedule(new TimerTask() {
                            @Override
                            public void run() {
                                RecordActivity.this.runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        ((TextView) findViewById(R.id.textViewDecibelNumber)).setText(String.valueOf(_recorder.getMaxAmplitude()));
                                    }
                                });
                            }
                        },1000,1000);
                    }
                } catch(Exception exception) {}
            }
        });

        stopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    if(_recorder != null) {
                        _recorder.stop();
                        _recorder.release();
                        _recorder = null;
                        _timer.cancel();
                        ((TextView) findViewById(R.id.textViewDecibelNumber)).setText("0");
                    } else if(_player != null) {
                        _player.stop();
                        _player.release();
                        _player = null;
                    }
                } catch(Exception exception) {}
            }
        });

        playButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    if(_recorder == null && _path != "") {
                        _player = new MediaPlayer();
                        _player.setDataSource(_path);
                        _player.prepare();
                        _player.start();
                    }
                } catch(Exception exception) {
                    System.out.println(exception.getMessage());
                }
            }
        });
    } catch(Exception exception) {
        System.out.println(exception.getMessage());
    }
}

答案 1 :(得分:0)

您应该使用Thread或Handler来获取不同时间的最大振幅值。使用你的代码,你实际上在启动MediaRecorder之后调用了getMaxAmplitude()方法,并且只调用了一次,所以它是正常的,它会给你0。

以下是我用来检测声音何时低于特定幅度的代码:http://pastebin.com/AradRpZm

答案 2 :(得分:0)

我这样做,对我来说没关系。 我希望它可以帮到你!

public class MediaRecorder{

private MediaRecorder mRecorder = null;
private Timer timer = new Timer();
File dir;
String file;

public Activity activity;

public void startRecording() {
    if (mRecorder == null) {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mRecorder.setOutputFile(getFilename());
        try {
            mRecorder.prepare();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mRecorder.start();
        mEMA = 0.0;
    }
}

public void stopRecording() {

    if (mRecorder != null) {
        mRecorder.stop();
        timer.cancel();
        timer.purge();
        mRecorder.release();
        mRecorder = null;
        deleteFile();
    }
}

private void deleteFile() {

    File sdcard = new File(file);
    boolean deleted = sdcard.delete();
    Log.i("Deleting File", String.valueOf(deleted));

}

@SuppressLint("SdCardPath")
private String getFilename() {
    dir = new File("/sdcard", "AUDIO_RECORDERING");
    if (!dir.exists()) {
        dir.mkdirs();
    }

    file = dir.getAbsolutePath() + "/" + System.currentTimeMillis()
            + ".mp3";
    return (file);
}

private double getAmplitude() {
    if (mRecorder != null) {
        double m = mRecorder.getMaxAmplitude();
        return (m);
    } else {

        return 0;
    }
}

public double getAmplitudeEMA() {
    double amp = getAmplitude();
    return amp;
}

}