- 浏览: 270564 次
- 性别:
- 来自: 济南
-
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
/**
* 原始音频的播放和录制
*
* 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多媒体学习笔记一
2012-09-04 10:47 7431 使用内置的camera应用程序捕获图像 /*** ... -
android多媒体学习笔记二
2012-09-04 10:53 848实现SurfaceHolder.Callback ,P ... -
android多媒体学习笔记三___图像合成
2012-09-05 11:36 654/** * 图像合成 * * @time 下午06:21 ... -
android多媒体部分学习笔记四___ Matrix
2012-09-05 11:40 768/*** 图像的缩放和旋转 Matrix** 1 0 0 x= ... -
android多媒体部分学习笔记五----audio
2012-09-08 16:08 746/*** 打开内置音乐播放器*/private void ge ... -
android多媒体部分学习笔记六----音频录制 mediaRecorder
2012-09-08 16:12 716/** * * 使用意图捕获音频 * * @time ... -
android多媒体部分学习笔记七------音频录制 mediaRecorder
2012-09-08 16:13 797/** * 自定义捕获音频 * * @time 下午12 ... -
android 多媒体部分学习笔记九----数字音频合成
2012-09-09 12:43 912/** * 数字音频合成 * * @time 下午12: ... -
android 多媒体部分学习笔记十 可视化频率(频谱)
2012-09-09 23:43 3267/** * 可视化频率 * * @time 下午12 ... -
android 多媒体部分学习笔记十--简单视频播放
2012-09-10 17:53 803/** * 简单播放 * * @time 下午05:15 ... -
android 多媒体部分学习笔记十二----mediaplay自定义播放器
2012-09-10 22:31 1764/** * * 自定义播放器 * * @time 下午 ... -
android 多媒体部分学习笔记十三----mediaStore 检索视频
2012-09-12 00:12 1072/** * mediaStore检索视频 * * @ti ... -
android 多媒体部分学习十四---网络视频播放(http/rtsp)
2012-09-12 14:36 1871/** * 网络视频播放 * * openCore * ... -
android 多媒体部分学习笔记十五-----视频录制
2012-09-12 15:02 826/** * 调用系统视频录制 * * @time 下午0 ...
相关推荐
《Android MediaRecorder深度解析——基于源代码学习》 在Android应用开发中,MediaRecorder是一个至关重要的组件,它允许开发者录制音频、视频,并将其保存到本地文件。本篇将深入探讨MediaRecorder的使用方法,...
7. **多媒体支持**:考虑到笔记可能包含文本、图片甚至音频,应用可能集成了多媒体处理库,如Glide或Picasso用于图片加载,以及MediaRecorder或ExoPlayer处理音频录制和播放。 8. **推送通知**:为了提醒用户新的...
通过分析和学习这个简易录音机的源码,我们可以掌握Android平台上的音频录制技术,并能将其应用于更复杂的应用场景,如语音笔记、语音识别等。同时,这也是理解Android多媒体框架运作机制的一个良好起点。
MediaRecorder是Android SDK中的一个类,它允许开发者以编程方式控制音频和视频的录制。通过设置各种参数,如输出格式、编码器、分辨率等,可以定制录制过程以满足不同应用场景。 2. **MediaRecorder的基本用法**...
通过这个"AndroidRecordAAC"项目,开发者可以学习到如何在Android应用中集成录音功能,特别是如何录制AAC格式的音频,这对于开发音乐应用、语音笔记应用或者任何需要录音功能的应用都是非常有价值的。同时,此项目也...
8. **录音**:录音功能涉及到`MediaRecorder`类,它负责录制音频。开发者需要知道如何设置录音参数,开始、暂停和停止录音,并将录制的音频保存到文件。 9. **日历**:日历应用需要与系统日历服务交互,这包括添加...
他们需要利用Android SDK中的各种组件和API,如ImageView、EditText、TextView等来构建用户界面,同时使用多媒体处理库来处理图片和音频,例如使用Android的MediaRecorder和MediaPlayer类来实现录音和播放功能。...