AudioRecord类相对于MediaRecorder来说,更加接近底层,为我们封装的方法也更少。然而实现一个AudioRecord的音频录制程序也很简单。本实例代码如下:
包demo.camera; 进口java.io.BufferedInputStream; 进口java.io.BufferedOutputStream; 进口java.io.DataInputStream; 进口java.io.DataOutputStream; 进口java.io.File; 进口java.io.FileInputStream; 进口java.io.FileOutputStream; 进口java.io.IOException; 进口android.app.Activity; 进口android.content.ContentValues; 进口android.content.Intent; 进口android.hardware.Camera.AutoFocusCallback; 进口android.media.AudioFormat; 进口android.media.AudioManager; 进口android.media.AudioRecord; 进口android.media.AudioTrack; 进口android.media.MediaPlayer; 进口android.media.MediaRecorder; 进口android.net.Uri; 进口android.os.AsyncTask; 进口android.os.Bundle; 进口android.os.Environment; 进口android.provider.MediaStore; 进口android.util.Log; 进口android.view.View; 进口android.widget.Button; 进口android.widget.TextView;/* * *该实例中,我们使用AudioRecord类来完成我们的音频录制程序 * AudioRecord类,我们可以使用三种不同的阅读方法来完成录制工作, *每种方法都有其实用的场合 *一,实例化一个AudioRecord类我们需要传入几种参数 * 1,AudioSource:这里可以是MediaRecorder.AudioSource.MIC * 2,SampleRateInHz:录制频率,可以为8000 hz或者11025 hz等,不同的硬件设备这个值不同 * 3,ChannelConfig:录制通道,可以为AudioFormat.CHANNEL_CONFIGURATION_MONO和AudioFormat.CHANNEL_CONFIGURATION_STEREO * 4,AudioFormat:录制编码格式,可以为AudioFormat.ENCODING_16BIT和8位,其中16位的仿真性比8位好,但是需要消耗更多的电量和存储空间 * 5、BufferSize:录制缓冲大小:可以通过getMinBufferSize来获取 *这样我们就可以实例化一个AudioRecord对象了 *二、创建一个文件,用于保存录制的内容 *同上篇 *三,打开一个输出流,指向创建的文件 * DataOutputStream dos=new DataOutputStream(新BufferedOutputStream(新FileOutputStream(文件))) *四,现在就可以开始录制了,我们需要创建一个字节数组来存储从AudioRecorder中返回的音频数据,但是 *注意,我们定义的数组要小于定义AudioRecord时指定的那个BufferSize *短[]缓冲=new短(BufferSize/4); * startRecording (); *然后一个循环,调用AudioRecord的阅读方法实现读取 *另外使用媒体播放器是无法播放使用AudioRecord录制的音频的,为了实现播放,我们需要 *使用AudioTrack类来实现 * AudioTrack类允许我们播放原始的音频数据 * * *一,实例化一个AudioTrack同样要传入几个参数 * 1,StreamType:在AudioManager中有几个常量,其中一个是STREAM_MUSIC; * 2,SampleRateInHz:最好和AudioRecord使用的是同一个值 * 3,ChannelConfig:同上 * 4,AudioFormat:同上 * 5、BufferSize:通过AudioTrack的静态方法getMinBufferSize来获取 * 6,模式:可以是AudioTrack.MODE_STREAM和MODE_STATIC,关于这两种不同之处,可以查阅文档 *二,打开一个输入流,指向刚刚录制内容保存的文件,然后开始播放,边读取边播放 * *实现时,音频的录制和播放分别使用两个AsyncTask来完成 */公开课MyAudioRecord2延伸活动{ 私人TextView stateView; 私人按钮btnStart、btnStop btnPlay btnFinish; 私人RecordTask记录器; 私人PlayTask球员; 私人文件audioFile; 私人布尔isRecording=true, isPlaying=false;//标记 私人int频率=8000;//录制频率,单位赫兹。这里的值注意了,写的不好,可能实例化AudioRecord对象的时候,会出错。我开始写成11025就不行。这取决于硬件设备 私人int channelConfig=AudioFormat.CHANNEL_CONFIGURATION_MONO; 私人int audioEncoding=AudioFormat.ENCODING_PCM_16BIT; 公共空间onCreate(包savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.my_audio_record); stateView=(TextView) this.findViewById (R.id.view_state); stateView.setText(“准备开始”); btnStart=(按钮)this.findViewById (R.id.btn_start); btnStop=(按钮)this.findViewById (R.id.btn_stop); btnPlay=(按钮)this.findViewById (R.id.btn_play); btnFinish=(按钮)this.findViewById (R.id.btn_finish); btnFinish.setText(“停止播放”); btnStop.setEnabled(假); btnPlay.setEnabled(假); btnFinish.setEnabled(假);//在这里我们创建一个文件,用于保存录制内容 .getAbsolutePath文件fpath=新文件(Environment.getExternalStorageDirectory()() + "/数据/文件/"); fpath.mkdirs();//创建文件夹 尝试{//创建临时文件,注意这里的格式为.pcm audioFile=文件。createTempFile(“记录”、“。pcm”, fpath); }捕捉(IOException e) {//TODO自动生成的catch块 e.printStackTrace (); } } 公共空间onClick(查看v) { int id=v.getId (); 开关(id) { 案例R.id.btn_start://开始录制//这里启动录制任务 录音机=new RecordTask (); recorder.execute (); 打破; 案例R.id.btn_stop://停止录制 这一点。isRecording=false;//更新状态//在录制完成时设置,在RecordTask的onPostExecute中完成 打破; 案例R.id.btn_play: 球员=new PlayTask (); player.execute (); 打破; 案例R.id.btn_finish://完成播放 这一点。isPlaying=false; 打破; } } 类RecordTask延伸AsyncTaskAndroid利用AudioRecord类实现音频录制程序