import android.os.Environment; import android.util.Log; import android.view.View;
import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView;
import com.telenav.funnl.android.R; /**
* 该实例中,我们使用AudioRecord类来完成我们的音频录制程序 * AudioRecord类,我们可以使用三种不同的read方法来完成录制工作, * 每种方法都有其实用的场合
* 一、实例化一个AudioRecord类我们需要传入几种参数
* 1、AudioSource:这里可以是MediaRecorder.AudioSource.MIC
* 2、SampleRateInHz:录制频率,可以为8000hz或者11025hz等,不同的硬件设备这个值不同
* 3、ChannelConfig:录制通道,可以为
udioFormat.CHANNEL_CONFIGURATION_MONO和udioFormat.CHANNEL_CONFIGURATION_STEREO
* 4、AudioFormat:录制编码格式,可以为AudioFormat.ENCODING_16BIT和BIT,其中16BIT的仿真性比8BIT好,但是需要消耗更多的电量和存储空间 * 5、BufferSize:录制缓冲大小:可以通过getMinBufferSize来获取
* 这样我们就可以实例化一个AudioRecord对象了 * 二、创建一个文件,用于保存录制的内容 * 同上篇
* 三、打开一个输出流,指向创建的文件
* DataOutputStream dos = new DataOutputStream(new BufferedOutputSream(new FileOutputStream(file)))
* 四、现在就可以开始录制了,我们需要创建一个字节数组来存储从udioRecorder中返回的音频数据,但是
* 注意,我们定义的数组要小于定义AudioRecord时指定的那个ufferSize * short[]buffer = new short[BufferSize/4]; * startRecording();
* 然后一个循环,调用AudioRecord的read方法实现读取
* 另外使用MediaPlayer是无法播放使用AudioRecord录制的音频的,为了实现播放,我们需要
* 使用AudioTrack类来实现
* AudioTrack类允许我们播放原始的音频数据 * *
* 一、实例化一个AudioTrack同样要传入几个参数
* 1、StreamType:在AudioManager中有几个常量,其中一个是TREAM_MUSIC; * 2、SampleRateInHz:最好和AudioRecord使用的是同一个值 * 3、ChannelConfig:同上
* 4、AudioFormat:同上
* 5、BufferSize:通过AudioTrack的静态方法getMinBufferSize来获取
* 6、Mode:可以是AudioTrack.MODE_STREAM和MODE_STATIC,关于这两种不同之处,可以查阅文档
* 二、打开一个输入流,指向刚刚录制内容保存的文件,然后开始播放,边读取边播放 *
* 实现时,音频的录制和播放分别使用两个AsyncTask来完成 */
public class PCMRecordActivity extends Activity implements OnClickListener{
private TextView stateView;
private Button btnStart,btnStop,btnPlay,btnFinish;
private RecordTask recorder; private PlayTask player; private File fpath; private File audioFile; private Context context;
private boolean isRecording=true, isPlaying=false; //标记
private int frequence = 16000;//8000; //录制频率,单位hz.这里的值注意了,写的不好,可能实例化AudioRecord对象的时候,会出错。我开始写成11025就不行。这取决于硬件设备
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.my_audio_record);
stateView = (TextView)this.findViewById(R.id.view_state); stateView.setText(\
btnStart = (Button)this.findViewById(R.id.btn_start); btnStart.setText(\
btnStart.setOnClickListener(this);
btnStop = (Button)this.findViewById(R.id.btn_stop); btnStop.setText(\
btnStop.setOnClickListener(this);
btnPlay = (Button)this.findViewById(R.id.btn_play); btnPlay.setText(\
btnPlay.setOnClickListener(this);
btnFinish = (Button)this.findViewById(R.id.btn_finish);
btnFinish.setText(\btnFinish.setOnClickListener(this); btnStop.setEnabled(false); btnPlay.setEnabled(false); btnFinish.setEnabled(false);
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))//手机有SD卡的情况 {
//在这里我们创建一个文件,用于保存录制内容 fpath = new
File(Environment.getExternalStorageDirectory().getAbsolutePath()+\ fpath.mkdirs();//创建文件夹 }else//手机无SD卡的情况 {
fpath = this.getCacheDir(); } try {
//创建临时文件,注意这里的格式为.pcm
audioFile = File.createTempFile(\ } catch (IOException e) {