安卓使用MediaRecorder录制音频的详细使用

news/2025/2/13 2:28:52/

安卓使用MediaRecorder录制音频的详细使用

文章目录

  • 安卓使用MediaRecorder录制音频的详细使用
    • 引言
    • 使用 MediaRecorder 的步骤
    • 常见问题及解决思路
      • 无法访问存储卡目录
      • 录制的音频文件没有声音
      • 录制过程中出现异常
      • MediaRecorder无法正常启动
      • 录制的音质或者画质很差
      • 录制的文件无法播放
    • 结语

本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134599828
最新更新地址 https://gitee.com/chenjim/chenjimblog

引言

在Android开发过程中,我们经常需要处理音频或视频相关的功能。比如,我们要做一个简单的录音机或者录像机。
在Android中录制音频有两种方式:MediaRecorderAudioRecord。两者的主要区别在于:

  • MediaRecorder提供了一种更高级别的API,能够直接录制并保存为特定的媒体文件格式(如MP3、AAC、AMR等)。其底层实际也使用了AudioRecord
  • AudioRecord提供了更底层的API,可以让我们自定义更多关于音频采样率、通道数等参数。但使用起来会比较复杂。

本文主要介绍如何在Android中使用MediaRecorder进行录音,并附带一些常见的问题及其解决方案。

使用 MediaRecorder 的步骤

使用MediaRecorder进行录音和录像,主要有以下几个步骤:

  1. 创建一个MediaRecorder对象。
  2. 设置MediaRecorder的各种参数,包括音视频源、输出文件、编码格式等等。
  3. 调用prepare()方法,让MediaRecorder做好开始录制的准备。
  4. 调用start()方法,开始录制。
  5. 在合适的时间调用stop()方法,结束录制。
  6. 最后别忘了调用release()方法,释放资源。

下面是一个简单的录音示例:

import android.media.MediaRecorder;
import android.os.Environment;public class RecorderAudio {public static final int RECORDER_SAMPLERATE = 44100;public static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";public static MediaRecorder getRecorder() {File dir = new File(Environment.getExternalStorageDirectory(), AUDIO_RECORDER_FOLDER);if (!dir.exists()) {dir.mkdirs();}File file = new File(dir, System.currentTimeMillis() + ".amr");// 创建一个MediaRecorder对象MediaRecorder recorder = new MediaRecorder();// 设置音频源为麦克风recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置音频输出格式recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 设置音频编码格式recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 设置输出文件路径recorder.setOutputFile(file.getAbsolutePath());return recorder;}public static void prepare(MediaRecorder recorder) {try {// 准备录制,初始化 MediaRecorder 的各种状态,并根据配置的信息创建一个 MediaCodec 对象。recorder.prepare();} catch (IOException e) {Log.e("MediaRecorder", "prepare() failed");}}public static void start(MediaRecorder recorder) {try {// 开始录制,开始真正的录音工作。它会启动一个循环来从 MediaCodec 对象中取出编码后的音频数据,然后写入到指定的文件中。recorder.start();} catch (RuntimeException e) {Log.e("MediaRecorder", "start() failed");}}public static void stop(MediaRecorder recorder) {// 停止录制,会让循环停止,并等待剩余的数据全部写入文件recorder.stop();// 释放掉所有的资源,包括`MediaRecorder`对象自身。recorder.release();recorder = null;}
}

注意:要确保所有的操作都在同一个线程中执行,否则可能会导致崩溃或异常。

如果想要在录制过程中,查看音量大小,可以通过调用getMaxAmplitude()方法来获取一小段时间内音频源数据中的最大振幅。
例如,每秒调用一次,可以得到近似音量值:
int maxAmplitude = recorder.getMaxAmplitude();

常见问题及解决思路

在实际使用MediaRecorder的过程中,可能会遇到各种各样的问题。这里列举一些常见的问题以及解决思路:

无法访问存储卡目录

原因:Android 6.0及以上版本要求用户明确授予应用读取外部存储的权限。

解决:在运行以上代码之前,需要动态申请权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE);
}

并在onRequestPermissionsResult回调方法中处理结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == REQUEST_WRITE_STORAGE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {startRecording();} else {Toast.makeText(this, "No storage permission", Toast.LENGTH_SHORT).show();}
}

录制的音频文件没有声音

原因:这可能是由于设置的音频源或编码器不正确导致的。

解决:确认已经设置了正确的音频源和编码器,并且麦克风功能正常。

录制过程中出现异常

原因:这可能是由于在多线程环境下操作MediaRecorder导致的。

解决:确保所有对MediaRecorder的操作都在同一个线程中执行。

MediaRecorder无法正常启动

这是最常见的问题。如果MediaRecorder无法正常启动,可能是由于参数设置错误,或者是设备不支持某种格式。
解决这个问题的方法是检查所有的参数设置,确保它们都是正确的,并且符合设备的要求。

录制的音质或者画质很差

这可能是因为采样率或者比特率设置得太低。解决这个问题的方法是提高采样率或者比特率,但是这样会增加文件的大小。

录制的文件无法播放

这可能是因为编码格式设置得不正确,或者设备不支持这种格式。解决这个问题的方法是更换编码格式,选择一种设备支持的格式。

结语

以上就是关于Android中MediaRecorder录制音频的详细使用的一些介绍。希望对你有所帮助。如果你在使用MediaRecorder的过程中遇到了其他问题,欢迎留言讨论。


http://www.ppmy.cn/news/1243914.html

相关文章

BEV+Transformer架构加速“上车”,智能驾驶市场变革开启

BEVTransformer成为了高阶智能驾驶领域最为火热的技术趋势。 近日,在2023年广州车展期间,不少车企及智能驾驶厂商都发布了BEVTransformer方案。其中,极越01已经实现了“BEVTransformer”的“纯视觉”方案的量产,成为国内唯一量产…

招投标信息可以用CRM系统来查看吗?

对于B2B企业来说获客难、获客成本高是共识。做大客户的企业通过招投标获取商机是一个重要获客途径,然而传统方式管理招投标信息问题很多,例如资料丢失、手工录入出错、信息分散、信息查找费时费力。为了解决这些难题小编推荐CRM系统,CRM系统需…

Redis 两种持久化方式 AOF 和 RDB

目录 一、Redis 的持久化 二、Redis 的持久化方式 RDB RDB 介绍 RDB 的触发方式:. 三、RDB的文件生成策略 四、Save 和 Bgsave 命令的区别 六、RDB 最佳配置 七、触发机制-不容忽略方式 AOF 一、AOF介绍 二、RDB所存在的问题 三、AOF 三种策略 四、AOF…

作为IT行业的过来人,宝贵的经验分享给刚入行的你

恍然间,发现自己已经在这个行业五年之久,回顾过往,思绪良多,一路走来,或多或少都经历过一些坎坷,也碰到过不少大大小小的困难。在此就不多加叙述了。 本篇文章主要想写给刚入门的程序员几个忠告&#xff0…

Linux shell编程学习笔记30:打造彩色的选项菜单

1 需求分析 在 Linux shell编程学习笔记21:用select in循环语句打造菜单https://blog.csdn.net/Purpleendurer/article/details/134212033?spm1001.2014.3001.5501 中,我们利用select in循环语句打造的菜单中,菜单项都是用系统设置的颜色配…

wangeditor实时预览

<template><div><!--挂载富文本编辑器--><div style"width: 45%;float: left;margin-left: 2%"><p>编辑内容</p><div id"editor" style"height: 100%"></div></div><div style"w…

最火web大屏可视化编辑器

前言&#xff1a; 乐吾乐Le5le大屏可视化设计器&#xff0c;零代码实现物联网、工业智能制造等领域的可视化大屏、触摸屏端UI以及工控可视化的解决方案。同时也是一个Web组态工具&#xff0c;支持2D、3D等多种形式&#xff0c;用于构建具有实时数据展示、监控预警、丰富交互的组…

【GD32307E-START】开发板开箱、开发环境建立及工程模板测试

01-GD32F307E-START开箱、开发环境建立及工程模板测试&#xff08;Keil-MDK GCC Template&#xff09; 兆易GD32307E-START开发板搭载GD32 ARM Cortex-M4微控制器主流芯片GD32F307。 开箱 板子的做工还是非常精良小巧的。有两颗按键&#xff0c;一颗是复位&#xff0c;一颗是…