概述:
Android多媒体框架包含对捕捉和编码各种常见音频格式的支持, 所以我们可以简单的集成音频操作到我们的APP中. 我们可以通过MediaRecorder API来录制声音, 前提是有可以支持的硬件. .
该文档描述了如何写一个APP来从麦克风捕捉音频, 并保存和播放音频. Android模拟器没有能力捕捉音频, 但是真实设备可能会提供这些功能.
处理音频捕捉:
从设备捕捉音频相对音视频播放来说会闲的稍微复杂一些, 但是依然挺简单的:
1. 创建一个android.media.MediaRecorder实例.
2. 使用MediaRecorder.setAudioSource()设置音频源. 这个源很可能来自MediaRecorder.AudioSource.MIC.
3. 使用MediaRecorder.setOutputFormat()来设置输出文件格式.
4. 使用MediaRecorder.setOutputFile()来设置输出文件的文件名.
5. 使用MediaRecorder.setAudioEncoder()方法来设置音频编码器.
6. 调用MediaRecorder实例的MediaRecorder.prepare()方法.
7. 要开始捕捉音频, 调用MediaRecorder.start()方法.
8. 要停止音频捕捉, 调用MediaRecorder.stop()方法.
9. 当MediaRecorder实例使用结束之后, 调用MediaRecorder.release()方法来释放它. 官方建议我们总是在使用结束之后调用它, 而不要寄希望于垃圾回收.
栗子: 录音和播放录音:
下面的代码展示了如何设置启动和停止录音, 并且播放保存的音频文件.
/*
* The application needs to have the permission to write to externalstorage
* if the output file is written to the external storage, and also the
* permission to record audio. These permissions must be set in the
* application's AndroidManifest.xml file, with something like:
*
* <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
* <uses-permissionandroid:name="android.permission.RECORD_AUDIO" />
*
*/
package com.android.audiorecordtest;
import android.app.Activity;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;
import java.io.IOException;
public classAudioRecordTest extendsActivity
{
private staticfinal String LOG_TAG= "AudioRecordTest";
private staticString mFileName =null;
private RecordButton mRecordButton= null;
private MediaRecorder mRecorder= null;
private PlayButton mPlayButton= null;
private MediaPlayer mPlayer= null;
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(){
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();
mRecorder = null;
}
class RecordButtonextends 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 PlayButtonextends 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";
}
@Override
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));
setContentView(ll);
}
@Override
public void onPause(){
super.onPause();
if (mRecorder!= null){
mRecorder.release();
mRecorder = null;
}
if (mPlayer!= null){
mPlayer.release();
mPlayer = null;
}
}
}
参考: https://developer.android.com/guide/topics/media/audio-capture.html