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操作方式和写法.