Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 69|回复: 2

在Android中可以使用MediaRecorder和AudioRecord两个API来实现录音

[复制链接]

393

主题

556

帖子

3294

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3294
发表于 2025-10-13 16:56:17 | 显示全部楼层 |阅读模式
在Android中,可以使用MediaRecorder和AudioRecord两个API来实现录音功能,适合不同的需求和场景。

[color=rgba(0, 0, 0, 0.8)]1. 使用MediaRecorder
  • 简单易用:MediaRecorder是一个高层API,适合基本的录音需求。它集成了录音、编码和压缩功能,支持多种音频格式(如AMR、3GP等)。
  • 录音流程:
  • 初始化MediaRecorder对象。
  • 设置音频源(如麦克风)和输出格式。
  • 准备并开始录音。
  • 结束录音后释放资源。
  • 示例代码:
  1. MediaRecorder mMediaRecorder = new MediaRecorder();
  2. mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  3. mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  4. mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  5. mMediaRecorder.setOutputFile("output.3gp");
  6. mMediaRecorder.prepare();
  7. mMediaRecorder.start(); // 开始录音
  8. // 录音结束后
  9. mMediaRecorder.stop();
  10. mMediaRecorder.release(); // 释放资源
复制代码


CSDN


2. 使用AudioRecord
  • 专业功能:AudioRecord提供了更底层的音频捕获能力,适合需要实时处理音频的应用,如语音识别或音频编辑。
  • 录音流程:
  • 创建AudioRecord对象并配置参数(音频源、采样率、声道数等)。
  • 调用startRecording()方法开始录音。
  • 通过read()方法读取音频数据。
  • 示例代码:
  1. int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
  2. AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig, audioFormat, bufferSize);
  3. audioRecord.startRecording(); // 开始录音
  4. byte[] audioData = new byte[bufferSize];
  5. int readSize = audioRecord.read(audioData, 0, bufferSize); // 读取音频数据
  6. audioRecord.stop(); // 停止录音
  7. audioRecord.release(); // 释放资源
复制代码


简书+1


3. 选择合适的API
  • MediaRecorder适合简单的录音需求,易于使用,适合大多数应用场景。
  • AudioRecord适合需要更高控制和实时处理的应用,适合专业开发者使用。
    通过以上两种方法,您可以根据自己的需求在Android应用中实现录音功能。无论是简单的语音备忘录还是复杂的音频处理,Android都提供了强大的支持。






[color=rgba(0, 0, 0, 0.8)]CSDN


Android 两种录音方式 - CSDN博客


[color=rgba(0, 0, 0, 0.8)]简书


Android 录音实现(AudioRecord) - 简书


查看全部





回复

使用道具 举报

393

主题

556

帖子

3294

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3294
 楼主| 发表于 2025-10-13 17:00:15 | 显示全部楼层
[Android开发备忘]关于AudioRecord和AudioTrack的缓冲区的理解,及避坑指南

ref:https://www.jianshu.com/p/32a457ccee32
回复

使用道具 举报

393

主题

556

帖子

3294

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3294
 楼主| 发表于 2025-10-17 06:49:53 | 显示全部楼层
请添加在调用 AudioRecord.getMinBufferSize 前检查录音权限

根据您的代码,需要在调用 `AudioRecord.getMinBufferSize` 方法前添加录音权限检查。以下是修改建议:

```java
public void doRecord(){
    // 检查录音权限
    if (checkSelfPermission(android.Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        // 权限未授予,需要请求权限
        // 可以通过 ActivityCompat.requestPermissions() 请求权限
        return;
    }
   
    try {
        int bufferSize = AudioRecord.getMinBufferSize(format.getSampleRate(),
                format.getChannelMask(), format.getEncoding());
        AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.MIC,
                format.getSampleRate(),
                format.getChannelMask(),
                format.getEncoding(), // 注意:这里应该是 format.getEncoding() 而不是 format
                bufferSize);
    } catch (SecurityException e) {
        // 处理权限被拒绝的情况
    }
}
```


要点说明:
1. 使用 `checkSelfPermission` 方法检查 `RECORD_AUDIO` 权限是否已授予
2. 如果权限未授予,应提前返回或请求权限
3. 同时保留 `try-catch` 块处理可能的 `SecurityException`
4. 注意修正 `AudioRecord` 构造函数中的参数错误:第四个参数应为 `format.getEncoding()` 而不是 [format](file://C:\s_c\MyApplication\app\src\main\java\cn\unicoder\myapplication\MyAudioRecord.java#L7-L7)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-10-25 08:51 , Processed in 0.011751 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表