安卓使用Audio Record自定义录音

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

安卓教程全解

安卓使用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);
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯AI架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值