您的位置:首页 > 其它

安卓使用Audio Record自定义录音

2017-11-21 18:45 99 查看
全栈工程师开发手册 (作者:栾鹏)

安卓教程全解

安卓使用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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: