Android AudioTrack/AudioRecord <2>
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操作方式和写法.

浙公网安备 33010602011771号