您的位置:首页 > 移动开发 > Android开发

Android音频录制与播放

2015-04-11 23:57 381 查看
下面的例子演示了用AudioRecord录音和AudioTrack播放的原理

public class MainActivity extends Activity {

private final static String TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void onClick(View v){
switch(v.getId()){
case R.id.btn_startRecord:
isRecording = true;
new Thread(){
public void run() {
testAudioRecord();
};
}.start();
break;
case R.id.btn_stopRecord:
isRecording = false;
break;
case R.id.btn_play:
new Thread(){
public void run() {
testAudioTrack();
};
}.start();
}
}

//给主线程发消息用
private Handler mHandler = new Handler();

private boolean isRecording = false;
//用AudioRecord来录音
private void testAudioRecord(){
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) {
e.printStackTrace();
}
OutputStream os;
try {
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 = new AudioRecord(MediaRecorder.AudioSource.MIC,
frequency, channelConfiguration, audioEncoding, bufferSize);
audioRecord.startRecording();
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "开始录音", Toast.LENGTH_SHORT).show();
}
});
int len = -1;
while(isRecording){
len = audioRecord.read(buffer, 0, bufferSize);
Log.d(TAG, "read-"+bufferSize+"-"+len);
for(int i=0;i<len;i++){
dos.writeShort(buffer[i]);
}
}
audioRecord.stop();
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "停止录音", Toast.LENGTH_SHORT).show();
}
});
dos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
//用AudioTrack来播放音频文件
private void testAudioTrack(){
int frequency = 11025;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm");

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();

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,
channelConfiguration, audioEncoding, audioLength, AudioTrack.MODE_STREAM);
audioTrack.play();
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "开始播放", Toast.LENGTH_SHORT).show();
}
});
audioTrack.write(audio, 0, audioLength);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/btn_startRecord"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="开始录音"/>
<Button
android:id="@+id/btn_stopRecord"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="停止录音"/>
<Button
android:id="@+id/btn_play"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="play"/>
</LinearLayout>

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  AudioRecord AudioTrack