import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioRecord; import android.media.AudioTrack; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private short [] mAudioRecordData; private short [] mAudioTrackData; private Button mStart; private Button mStop; private Button mPlay; private Button mWipe; private File mAudioFile; private AudioRecord mAudioRecord; private AudioTrack mAudioTrack; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); registerListener(); } private void registerListener() { //开始录制 把录制的数据存在mAudioFile文件中 mStart.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { new Thread( new Runnable() { public void run() { try { mAudioRecord.startRecording(); DataOutputStream dos = new DataOutputStream( new BufferedOutputStream( new FileOutputStream(mAudioFile))); while (mAudioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { int number = mAudioRecord.read( mAudioRecordData, 0 , mAudioRecordData.length); for ( int i = 0 ; i < number; i++) { dos.writeShort(mAudioRecordData[i]); } if (AudioRecord.ERROR_BAD_VALUE != number && AudioRecord.ERROR != number) { Log.d( "TAG" , String.valueOf(number)); } } dos.flush(); dos.close(); Log.d( "TAG" , "dos.close()" ); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }); //停止录音 mStop.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { if (mAudioRecord != null && mAudioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { mAudioRecord.stop(); } } }); //开始播放 将数据写入到AudioTrack中播放 mPlay.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { new Thread( new Runnable() { public void run() { try { mAudioTrack.play(); DataInputStream dis = new DataInputStream( new BufferedInputStream( new FileInputStream(mAudioFile))); Log.d( "TAG" , "dis.available=" + dis.available()); while (mAudioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING && dis.available() > 0 ) { int i = 0 ; while (dis.available() > 0 && i < mAudioTrackData.length) { mAudioTrackData[i] = dis.readShort(); i++; } wipe(mAudioTrackData, 0 , mAudioTrackData.length); // 然后将数据写入到AudioTrack中 mAudioTrack.write(mAudioTrackData, 0 , mAudioTrackData.length); } mAudioTrack.stop(); dis.close(); Log.d( "TAG" , "dis.close()" ); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }); mWipe.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { wipe(mAudioTrackData, 0 , mAudioTrackData.length); } }); } //初始化 private void init() { mStart = (Button) findViewById(R.id.start); mStop = (Button) findViewById(R.id.stop); mPlay = (Button) findViewById(R.id.play); mWipe = (Button) findViewById(R.id.wipe); if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { File file = new File(Environment.getExternalStorageDirectory() .getAbsolutePath() + "/audio/" ); if (!file.exists()) { file.mkdirs(); } //创建录音文件 mAudioFile = new File(file, System.currentTimeMillis() + ".pcm" ); } try { int sampleRateInHz = 44100 ; //所有Android系统都支持的频率 //AudioFormat.CHANNEL_IN_MONO但声道输入 AudioFormat.ENCODING_PCM_16BIT这个所有Android系统都支持 int recordBufferSizeInBytes = AudioRecord.getMinBufferSize( sampleRateInHz, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); Log.d( "TAG" , "recordBufferSizeInBytes=" + recordBufferSizeInBytes); mAudioRecordData = new short [recordBufferSizeInBytes]; // 创建AudioRecord实例 mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, recordBufferSizeInBytes); int trackBufferSizeInBytes = AudioRecord.getMinBufferSize( sampleRateInHz, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); // 创建mAudioTrack实例 mAudioTrackData = new short [trackBufferSizeInBytes]; mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRateInHz, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, trackBufferSizeInBytes, AudioTrack.MODE_STREAM); } catch (IllegalArgumentException e) { e.printStackTrace(); } } /** * 消除噪音 */ private void wipe( short [] lin, int off, int len) { int i, j; for (i = 0 ; i < len; i++) { j = lin[i + off]; lin[i + off] = ( short ) (j >> 2 ); } } @Override protected void onStop() { if (mAudioFile.exists()) { mAudioFile.delete(); } if (mAudioRecord != null ) { mAudioRecord.release(); mAudioRecord = null ; } if (mAudioTrack != null ) { mAudioTrack.release(); mAudioTrack = null ; } super .onStop(); } } |