Android MediaRecorder与AudioRecord音频录制

简介: MediaRecorderAudioRecordMediaRecorder需要的权限 /** * 开始录音 */ class startRecordListener implements OnClickList...

MediaRecorder
AudioRecord

  1. MediaRecorder
    需要的权限
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  /**
   * 开始录音
   */
  class startRecordListener implements OnClickListener {

    @Override public void onClick(View v) {
      try {
        MediaRecorder mRecorder = new MediaRecorder();
        // 设置声音源为麦克风
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        // 设置输出格式为3gp
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        // 设置输出文件路径,mFileName为录音音频输出路径
        mRecorder.setOutputFile(mFileName);
        // 设置声音解码AMR_NB
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        // 媒体录制器准备
        mRecorder.prepare();
        // 开始录制
        mRecorder.start();
      } catch (IOException e) {
      }
    }
  }

  /**
   * 停止录音
   */
  class stopRecordListener implements OnClickListener {

    @Override public void onClick(View v) {
      mRecorder.stop();
      mRecorder.release();
      mRecorder = null;
    }
  }

2.AudioRecord

AudioRecord录音步骤:
1.    创建一个数据流。
2.    构造一个AudioRecord对象,其中需要的最小录音缓存buffer大小可以通过getMinBufferSize方法得到。如果buffer容量过小,将导致对象构造的失败。
3.    初始化一个buffer,该buffer大于等于AudioRecord对象用于写声音数据的buffer大小。
4.    开始录音。
5.    从AudioRecord中读取声音数据到初始化buffer,将buffer中数据导入数据流。
6.    停止录音。
7.    关闭数据流。

录音代码:

  /**
   * 录音,需要在新的线程中执行,防止主线程阻塞
   */
  private void record() {
    int frequency = 11025;
    int channelConfiguration = AudioFormat.CHANNEL_IN_STEREO;
    int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
    try {
      // 创建一个数据输入流往文件里写数据
      OutputStream os = new FileOutputStream(mFileName);
      BufferedOutputStream bos = new BufferedOutputStream(os);
      DataOutputStream dos = new DataOutputStream(bos);
      // 创建一个AudioRecord对象来录音
      int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
      AudioRecord mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration,
          audioEncoding, bufferSize);
      short[] buffer = new short[bufferSize];
      // 开始录音
      mAudioRecord.startRecording();

      isRecording = true;
      Log.e(TAG, "record: 录音开始");
      while (isRecording) {
        int bufferReadResult = mAudioRecord.read(buffer, 0, bufferSize);
        for (int i = 0; i < bufferReadResult; i++) {
          dos.writeShort(buffer[i]);
          Log.e(TAG, "record: 录音中...");
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 停止录音
   */
  class stopRecordListener implements OnClickListener {

    @Override public void onClick(View v) {
      mAudioRecord.stop();
      Log.e(TAG, "record: 录音结束");
    }
  }

播放代码:

  /**
   * 播放录音
   */
  class startPlayListener implements OnClickListener {

    @Override public void onClick(View v) {
      try {
        // Get the file we want to playback.
        File file = new File(mFileName);
        // Get the length of the audio stored in the file (16 bit so 2 bytes per short)
        // and create a short array to store the recorded audio.
        int musicLength = (int) (file.length() / 2);
        short[] music = new short[musicLength];
        // Create a DataInputStream to read the audio data back from the saved file
        InputStream is = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(is);
        DataInputStream dis = new DataInputStream(bis);

        // Read the file into the music array.
        int i = 0;
        while (dis.available() > 0) {
          music[i++] = dis.readShort();
        }

        // close the input streams
        dis.close();

        // Create a new AudioTrack object using the same parameters as the AudioRecord
        // object used to create the file.
        AudioTrack audioTrack =
            new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_IN_STEREO,
                AudioFormat.ENCODING_PCM_16BIT, musicLength * 2, AudioTrack.MODE_STREAM);
        Log.e(TAG, "onClick: 开始播放");
        // Start playback
        audioTrack.play();

        // Write the music buffer to the AudioTrack object
        audioTrack.write(music, 0, musicLength);
        Log.e(TAG, "onClick: 播放结束");
        audioTrack.stop();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
目录
相关文章
|
6月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
6月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
6月前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
6月前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
6月前
|
存储 Android开发
安卓app,MediaPlayer播放本地音频 | 按钮控制播放和停止
在Jetpack Compose中,不直接操作原生Android组件如`Button`和`MediaPlayer`,而是使用Compose UI构建器定义界面并结合ViewModel管理音频播放逻辑。以下示例展示如何播放本地音频并用按钮控制播放/停止:创建一个`AudioPlayerViewModel`管理`MediaPlayer`实例和播放状态,然后在Compose UI中使用`Button`根据`isPlaying`状态控制播放。记得在`MainActivity`设置Compose UI,并处理相关依赖和权限。
|
6月前
|
存储 编解码 Android开发
58. 【Android教程】音频录制:MediaRecord
58. 【Android教程】音频录制:MediaRecord
61 2
|
6月前
|
Android开发 Kotlin
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【本地】音频,播放完随机播放下一首,遇到播放错误,也自动播放下一首
使用Kotlin和Jetpack Compose开发的安卓应用中,实现了两个EvoPlayer同时播放res/raw目录下的音频。一个音轨播放人声(顺序播放),另一个播放背景音乐(随机播放)。每个音轨都有独立的播放和停止控制,且在播放结束或遇到错误时会自动切换到下一首。MediaPlayer置于ViewModel中,UI界面包含播放和停止按钮,控制两个音轨。每次切换音频前,还会随机调整播放速度在0.9到1.2之间。代码示例展示了如何创建ViewModel和UI以实现这一功能。
|
Android开发
我的Android进阶之旅------&gt;介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程,因此今天百度了一下gif动画的制作工具,找到了这款不错的软件GifCam。
1292 0
|
9天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
14天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。