AudioTrack可以读取网络上面的,这个需要后面去添加,涉及的东西太多了,

现在看看AudioRecord,查看API : ​​http://developer.android.com/reference/android/media/AudioRecord.html​

<1> : AudioRecord构造函数:



public  AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)


第一个参数: audioSource : 音源,一般是设备的mic,当然也可以录取网络上面的,不过不管从何处得到音源,都是处理字节流,音源种类参见:​​http://developer.android.com/reference/android/media/MediaRecorder.AudioSource.html​

第二个参数:sampleRateInHz : 采样率,现在普通的一般采用44100,当然还有16000,因设备而一定吧.

第三个参数:channelConfig :  ​​CHANNEL_IN_MONO 等,相对AudioTrack,OUT改成了IN.​

第四个参数:audioFormat : 16位或者8位;

第五个参数:bufferSizeInBytes : 一般的手机android,采用​​getMinBufferSize(int, int, int)​​获取,不过人工也可以根据特定操作环境设置.

<2> : 初始化:



private AudioRecord mRec;
private int mSampleRateInHz = 44100;
private int mRecBufferSize;



mRecBufferSize = AudioRecord.getMinBufferSize(mSampleRateInHz,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
mRec = new AudioRecord(MediaRecorder.AudioSource.MIC, mSampleRateInHz,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
mRecBufferSize);

mRec.startRecording();


<3> : 同样在一个线程中进行录音:



package com.example.audiodemo02;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

private AudioRecord mRec;
private int mSampleRateInHz = 44100;
private int mRecBufferSize;

private Button mStart;
private Button mStop;

private boolean mRecbool=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mStart=(Button)findViewById(R.id.button1);
mStart.setOnClickListener(this);

mRecBufferSize = AudioRecord.getMinBufferSize(mSampleRateInHz,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
mRec = new AudioRecord(MediaRecorder.AudioSource.MIC, mSampleRateInHz,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
mRecBufferSize);

mRec.startRecording();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

private class RecordThread implements Runnable {

@Override
public void run() {
// TODO Auto-generated method stub

FileOutputStream fos = null;

File mFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/data/files/");
mFile.mkdir();

mRecbool=true;

try {
File.createTempFile("rec", ".pcm", mFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
fos=new FileOutputStream(mFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

short[] rec_buffer = new short[mRecBufferSize];
int length;

while (mRecbool) {

mRec.read(rec_buffer, 0, rec_buffer.length);

try {
fos.write(short2byte(rec_buffer), 0, mRecBufferSize);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

// convert short to byte
private byte[] short2byte(short[] sData) {
int shortArrsize = sData.length;
byte[] bytes = new byte[shortArrsize * 2];
for (int i = 0; i < shortArrsize; i++) {
bytes[i * 2] = (byte) (sData[i] & 0x00FF);
bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
sData[i] = 0;
}
return bytes;

}

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
int id=arg0.getId();
switch(id){
case R.id.button1:
Thread recThread=new Thread(new RecordThread(),"rec");
recThread.start();
break;
case R.id.button2:
mRecbool=false;
break;
}
}

}


 

其余的可以类似AudioTrack操作方式和写法.