我正在开发一款可以使用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;
}
}
}
答案 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;
}
}