`

android多媒体部分学习笔记八------音频录制 mediaRecorder

阅读更多

/**
* 原始音频的播放和录制
*
* audio
*
* audioTrack
*
*
* @time 下午12:58:03
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
@SuppressWarnings("static-access")
public class AltAudioRecorderActivity extends Activity implements OnCompletionListener, OnClickListener {
private Button btn_stop_play, btn_start_play, btn_start_record, btn_stop_record;


private File audioFile;


private int frequency = 11025;
private int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
private RecordAudio recordAudio;
private PlayRecord playRecord;
private boolean isRecording = false;
private boolean isPlaying = false;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alt_recoder);
findView();


// 创建目录
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Andoroid/data/cn.yue.mrdemo.CustomRecorderActivity/files/");
file.mkdirs();


try {
audioFile = file.createTempFile("recording", ".pcm", file);
} catch (IOException e) {
e.printStackTrace();
}


}


/**
* 实例化控件
*/
private void findView() {
btn_start_record = (Button) this.findViewById(R.id.btn_alt_start_recording);
btn_stop_record = (Button) this.findViewById(R.id.btn_alt_stop_recording);
btn_start_play = (Button) this.findViewById(R.id.btn_alt_start_palyback);
btn_stop_play = (Button) this.findViewById(R.id.btn_alt_stop_playback);


btn_start_record.setOnClickListener(this);
btn_stop_record.setOnClickListener(this);
btn_start_play.setOnClickListener(this);
btn_stop_play.setOnClickListener(this);


btn_stop_record.setEnabled(false);
btn_start_play.setEnabled(false);
btn_stop_play.setEnabled(false);


}


@Override
public void onClick(View v) {
if (v == btn_start_record) {
record();
} else if (v == btn_stop_record) {
stopRecord();
} else if (v == btn_start_play) {
play();
} else if (v == btn_stop_play) {
stopPlay();
}


}


@Override
public void onCompletion(MediaPlayer mp) {


}


/********************************************/
/**
* 录制音频
*/
private void record() {
btn_start_record.setEnabled(false);
btn_stop_record.setEnabled(true);
btn_start_play.setEnabled(true);
recordAudio = new RecordAudio();
recordAudio.execute();
}


/**
* 停止录制音频
*/
private void stopRecord() {
isRecording = false;
}


/**
* 播放
*/
private void play() {
btn_start_play.setEnabled(true);
playRecord = new PlayRecord();
playRecord.execute();
btn_stop_play.setEnabled(true);
}


/**
* 停止播放
*/
private void stopPlay() {
isPlaying = false;
btn_start_play.setEnabled(true);
btn_stop_play.setEnabled(false);
}


/*************************************************/


/**
* 录音
*/
public class RecordAudio extends AsyncTask<Void, Integer, Void> {


@Override
protected Void doInBackground(Void... params) {
isRecording = true;
try {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(audioFile)));
int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize);
short[] buffer = new short[bufferSize];
audioRecord.startRecording();


int r = 0;
while (isRecording) {
int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
for (int i = 0; i < bufferReadResult; i++) {
dos.writeShort(buffer[i]);
}
publishProgress(new Integer(r));
r++;
}
audioRecord.stop();
dos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


return null;
}
}


/**
* 播放
*/
private class PlayRecord extends AsyncTask<Void, Integer, Void> {


@Override
protected Void doInBackground(Void... params) {
isPlaying = true;
int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
short[] audiodata = new short[bufferSize];
try {
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(audioFile)));
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,//
frequency,//
channelConfiguration,//
audioEncoding,//
bufferSize, //
AudioTrack.MODE_STREAM//
);
audioTrack.play();
while (isPlaying && dis.available() > 0) {
int i = 0;
while (dis.available() > 0 && i < audiodata.length) {
audiodata[i] = dis.readShort();
i++;
}
audioTrack.write(audiodata, 0, audiodata.length);
}
dis.close();
btn_start_play.setEnabled(false);
btn_stop_play.setEnabled(true);


} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


return null;
}


}


}

分享到:
评论

相关推荐

    Android安卓经典设计例程源代码-MediaRecorder.rar

    《Android MediaRecorder深度解析——基于源代码学习》 在Android应用开发中,MediaRecorder是一个至关重要的组件,它允许开发者录制音频、视频,并将其保存到本地文件。本篇将深入探讨MediaRecorder的使用方法,...

    Android-NONo-Android是NONo--下一代个人云笔记平台的Android端应用

    7. **多媒体支持**:考虑到笔记可能包含文本、图片甚至音频,应用可能集成了多媒体处理库,如Glide或Picasso用于图片加载,以及MediaRecorder或ExoPlayer处理音频录制和播放。 8. **推送通知**:为了提醒用户新的...

    安卓Android源码——简易录音机.zip

    通过分析和学习这个简易录音机的源码,我们可以掌握Android平台上的音频录制技术,并能将其应用于更复杂的应用场景,如语音笔记、语音识别等。同时,这也是理解Android多媒体框架运作机制的一个良好起点。

    MediaRecoder实现录制视频

    MediaRecorder是Android SDK中的一个类,它允许开发者以编程方式控制音频和视频的录制。通过设置各种参数,如输出格式、编码器、分辨率等,可以定制录制过程以满足不同应用场景。 2. **MediaRecorder的基本用法**...

    Android代码-AndroidRecordAAC

    通过这个"AndroidRecordAAC"项目,开发者可以学习到如何在Android应用中集成录音功能,特别是如何录制AAC格式的音频,这对于开发音乐应用、语音笔记应用或者任何需要录音功能的应用都是非常有价值的。同时,此项目也...

    Android 学习实例整合

    8. **录音**:录音功能涉及到`MediaRecorder`类,它负责录制音频。开发者需要知道如何设置录音参数,开始、暂停和停止录音,并将录制的音频保存到文件。 9. **日历**:日历应用需要与系统日历服务交互,这包括添加...

    手机记事软件设计与实现.zip

    他们需要利用Android SDK中的各种组件和API,如ImageView、EditText、TextView等来构建用户界面,同时使用多媒体处理库来处理图片和音频,例如使用Android的MediaRecorder和MediaPlayer类来实现录音和播放功能。...

Global site tag (gtag.js) - Google Analytics