安卓使用Audio Record自定义录音

来源:互联网 发布:淘宝精华帖子 编辑:程序博客网 时间:2024/06/05 06:57

全栈工程师开发手册 (作者:栾鹏)

安卓教程全解

安卓使用Audio Record自定义录音。

创建异步任务后台录音

创建异步任务

recordbutton.setOnClickListener(new OnClickListener() {      public void onClick(View v) {          //创建异步任务,在后台录制声音        AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {          @Override          protected Void doInBackground(Void... params) {            isRecording = true;            record();            return null;          }        };        task.execute();      }    });

录音功能函数

//使用Audio Record录制原始音频  private boolean isRecording = false;  private void record() {    int frequency = 11025;   //录音频率    int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;   //频道配置    int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;   //录音编码    File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm");    //创建新文件    try {      file.createNewFile();    } catch (IOException e) {      Log.d("自定义录音", "IO Exception", e);    }    try {      OutputStream os = new FileOutputStream(file);      BufferedOutputStream bos = new BufferedOutputStream(os);      DataOutputStream dos = new DataOutputStream(bos);      int bufferSize = AudioRecord.getMinBufferSize(frequency,channelConfiguration,audioEncoding);      short[] buffer = new short[bufferSize];      //创建一个新的AudioRecord对象来录制音频      AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,frequency,channelConfiguration,audioEncoding, bufferSize);       audioRecord.startRecording();      Log.v("自定义录音", "开始录音");      while (isRecording) {        int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);        for (int i = 0; i < bufferReadResult; i++)          dos.writeShort(buffer[i]);      }      audioRecord.stop();      dos.close();    } catch (Throwable t) {      Log.d("自定义录音", "An error occurred during recording", t);    }  }

停止录音

只需要将全局变量isRecording 设置为false即可跳出后台程序,停止录音。

播放录制的音频

//使用Audio Track播放原始音频  private void playback() {    int frequency = 11025/2;    int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;    int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;    File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm");    //用于存储音轨的short数组,(每个short占用16位,即2个字节)    int audioLength = (int)(file.length()/2);    short[] audio = new short[audioLength];    try {      InputStream is = new FileInputStream(file);      BufferedInputStream bis = new BufferedInputStream(is);      DataInputStream dis = new DataInputStream(bis);      int i = 0;      while (dis.available() > 0) {        audio[i] = dis.readShort();        i++;      }      //关闭输入流      dis.close();      Log.v("自定义录音", "播放录音");      //创建和播放新的AudioTrack对象      AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,                                             frequency,                                             channelConfiguration,                                             audioEncoding,                                             audioLength,                                             AudioTrack.MODE_STREAM);      audioTrack.play();       audioTrack.write(audio, 0, audioLength);    } catch (Throwable t) {      Log.d("自定义录音", "An error occurred during playback", t);    }  }
原创粉丝点击