Android利用AudioRecord类实现音频录制程序

  

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延伸AsyncTask

Android利用AudioRecord类实现音频录制程序