全栈工程师开发手册 (作者:栾鹏)
安卓使用Audio Record自定义录音。
创建异步任务后台录音
创建异步任务
recordbutton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//创建异步任务,在后台录制声音
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
isRecording = true;
record();
return null;
}
};
task.execute();
}
});
录音功能函数
//使用Audio Record录制原始音频
private boolean isRecording = false;
private void record() {
int frequency = 11025; //录音频率
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; //频道配置
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; //录音编码
File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm");
//创建新文件
try {
file.createNewFile();
} catch (IOException e) {
Log.d("自定义录音", "IO Exception", e);
}
try {
OutputStream os = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(os);
DataOutputStream dos = new DataOutputStream(bos);
int bufferSize = AudioRecord.getMinBufferSize(frequency,channelConfiguration,audioEncoding);
short[] buffer = new short[bufferSize];
//创建一个新的AudioRecord对象来录制音频
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,frequency,channelConfiguration,audioEncoding, bufferSize);
audioRecord.startRecording();
Log.v("自定义录音", "开始录音");
while (isRecording) {
int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
for (int i = 0; i < bufferReadResult; i++)
dos.writeShort(buffer[i]);
}
audioRecord.stop();
dos.close();
} catch (Throwable t) {
Log.d("自定义录音", "An error occurred during recording", t);
}
}
停止录音
只需要将全局变量isRecording 设置为false即可跳出后台程序,停止录音。
播放录制的音频
//使用Audio Track播放原始音频
private void playback() {
int frequency = 11025/2;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm");
//用于存储音轨的short数组,(每个short占用16位,即2个字节)
int audioLength = (int)(file.length()/2);
short[] audio = new short[audioLength];
try {
InputStream is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
int i = 0;
while (dis.available() > 0) {
audio[i] = dis.readShort();
i++;
}
//关闭输入流
dis.close();
Log.v("自定义录音", "播放录音");
//创建和播放新的AudioTrack对象
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
frequency,
channelConfiguration,
audioEncoding,
audioLength,
AudioTrack.MODE_STREAM);
audioTrack.play();
audioTrack.write(audio, 0, audioLength);
} catch (Throwable t) {
Log.d("自定义录音", "An error occurred during playback", t);
}
}