通过AudioRecord实现自定义音频属性录音,使用AudioTrack进行播放
直接贴代码了
IRecord和IPlay自定义的两个接口。
录音实现:
package com.ione.recorddemo;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* Created by user on 2014/11/13.
*/
public class RecordImpl implements IRecord {
private boolean isRecording;
protected static int FREQUENCY = 16000;
private static int CHANNEL = AudioFormat.CHANNEL_IN_MONO;
private static int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private final String FILEPATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/demo.wav";
private AudioRecord audioRecord;
@Override
public boolean open(int bufferSize) {
audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
FREQUENCY, CHANNEL, ENCODING, bufferSize);
if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
audioRecord.startRecording();
return true;
}
return false;
}
@Override
public void close() {
if (audioRecord != null) {
if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
audioRecord.stop();
}
if (audioRecord != null) {
audioRecord.release();
audioRecord = null;
}
}
}
@Override
public void start() {
File file = creatFile();
int bufferSize = AudioRecord.getMinBufferSize(FREQUENCY, CHANNEL, ENCODING);
if(!open(bufferSize)){
return ;
}
try {
OutputStream os = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(os);
DataOutputStream dos = new DataOutputStream(bos);
short[] buffer = new short[bufferSize];
audioRecord.startRecording();
isRecording = true;
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.e("AudioRecord", "Recording Failed");
}
}
@Override
public void stop() {
isRecording = false;
}
private File creatFile() {
File file = new File(FILEPATH);
if (file.exists())
file.delete();
try {
file.createNewFile();
} catch (IOException e) {
throw new IllegalStateException("Failed to create " + file.toString());
}
return file;
}
}
播放实现:
package com.ione.recorddemo;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Environment;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
/**
* Created by user on 2014/11/13.
*/
public class PlayImpl implements IPlay {
protected static int FREQUENCY = 16000;
private static int CHANNEL = AudioFormat.CHANNEL_IN_MONO;
private static int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private final String FILEPATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/demo.wav";
private AudioTrack audioTrack;
@Override
public void play() {
File file = new File(FILEPATH);
int musicLength = (int) (file.length() / 2);
short[] music = new short[musicLength];
try {
InputStream is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
int i = 0;
while (dis.available() > 0) {
music[i] = dis.readShort();
i++;
}
dis.close();
open(musicLength);
audioTrack.play();
audioTrack.write(music, 0, musicLength);
audioTrack.stop();
} catch (Throwable t) {
Log.e("AudioTrack", "Playback Failed");
}
}
@Override
public void open(int musicLength){
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
FREQUENCY,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
musicLength * 2,
AudioTrack.MODE_STREAM);
}
@Override
public void stop() {
audioTrack.stop();
}
}
MainActivity.class
package com.ione.recorddemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private static RecordImpl mRecord;
private static PlayImpl mPlay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mRecord = new RecordImpl();
mPlay = new PlayImpl();
findViewById(R.id.record_start).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
public void run() {
mRecord.start();
}
});
thread.start();
}
});
findViewById(R.id.record_stop).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRecord.stop();
mRecord.close();
}
});
findViewById(R.id.play_start).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPlay.play();
}
});
findViewById(R.id.record_stop).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRecord.stop();
mRecord.close();
}
});
findViewById(R.id.play_start).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPlay.play();
}
});
}
}
demo http://download.csdn.net/download/yangysng07/8162321