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

安卓使用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.mzph.cn/news/171869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Object.is和====和==的区别

Object.is() 方法和比较操作符 、 用于比较两个值的相等性,但它们在比较方式和行为上有一些区别。Object.is() 方法是严格相等比较,而 操作符也是严格相等比较,但 操作符是相等比较。 严格相等比较( ) 要求比较的…

HONOR荣耀MagicBook 15 2021款 锐龙版R5(BMH-WFQ9HN)原厂Windows11预装OEM系统含F10智能还原

链接:https://pan.baidu.com/s/1faYtC5BIDC2lsV_JSMI96A?pwdj302 提取码:j302 原厂系统Windows11.22H2工厂模式安装包,含F10一键智能还原,自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、荣耀 电脑管家等预装程序 …

process control 化学工程 需要用到MATLAB的Simulink功能

process control 化学工程 需要用到MATLAB的Simulink功能 所有问题需要的matlab simulink 模型 WeChat: ye1-6688 The riser tube brings in contact the recirculating catalyst with the feed oil, which then vaporizes and splits to lighter components as it flows up th…

服务器下db(数据库)的执行

1、查看 select * from xxxx(表名) where xxx(列表)1 and.......正常写就行 2、插入 如果你想要在 SELECT INSERT INTO … SELECT 语句中将部分列保持不变,只改变一两列的值,可以在 语句中直接设置目标列的值,而其他列从源表中…

【代码随想录】算法训练计划31

贪心 1、455. 分发饼干 题目: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且…

【C++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )

文章目录 一、重新解释类型转换 reinterpret_cast1、指针数据类型转换 - C 语言隐式类型转换报错 ( 转换失败 )2、指针数据类型转换 - C 语言显示类型强制转换 ( 转换成功 )3、指针数据类型转换 - C 静态类型转换 static_cast ( 转换失败 )4、指针数据类型转换 - C 重新解释类型…

Simulink 的代数环

代数环, 就是由于模型的输出反馈到模块或子系统先的某个输入端, 如果这个输入是直接馈入的, 那么二者在同一个采样点内需得到求解, 但又互相依赖, 哪一方都不能完成求解过程, 使得解算器无法解算导致错误产生, 这样的情况称为代数环。 一旦 Simulink 遇到代数环, 将根据 Confi…

Binlog vs. Redo Log:数据库日志的较劲【高级】

🎏:你只管努力,剩下的交给时间 🏠 :小破站 Binlog vs. Redo Log:数据库日志的较劲【高级】 前言第一:事务的生命周期事务的生命周期Binlog和Redo Log记录事务的一致性和持久性Binlog的记录过程R…

二叉树--算法题总结

1、利用层序遍历的产生的字符串来创建二叉树 /*** 使用层序遍历的字符串创建二叉树* param treeInfo* return*/public static TreeNode generateTreeNodeSecond(String treeInfo) {LinkedList<TreeNode> treeNodeLinkedList new LinkedList<>();if(StringUtils.is…

Flask 使用Jinja2模板引擎

Jinja2&#xff0c;由Flask框架的创作者开发&#xff0c;是一款功能丰富的模板引擎&#xff0c;以其完整的Unicode支持、灵活性、高效性和安全性而备受推崇。最初受Django模板引擎启发&#xff0c;Jinja2为Flask提供了强大的模板支持&#xff0c;后来也成为其他项目的首选。在本…

@JsonSerialize注解的使用

使用场景 ** 在开发中&#xff0c;有时候某些字段需要特殊处理&#xff0c;比如我们有一个日期字段&#xff0c;当日期为NULL时给前端不返回NULL而返回为其他等信息&#xff0c;就需要自定义字段的序列化。这就是JsonSerialize的用处 ** 1&#xff1a;先写一个指定的处理类 pa…

python环境搭建-yolo代码跑通-呕心沥血制作(告别报错no module named torch)

安装软件 安装过的可以查看有没有添加环境变量 好的! 我们发车! 如果你想方便快捷的跑通大型项目,那么必须安装以下两个软件: 1.pycharm2.anaconda对应作用: pycharm:专门用来跑通python项目的软件,相当于一个编辑器,可以debug调试,可以接受远程链接调试!anaconda:专…

英伟达不同系列GPU介绍

英伟达有以下几个系列的产品线&#xff0c;并介绍它们的特点和主要应用领域&#xff1a; 1. GeForce系列&#xff08;G系列&#xff09;&#xff1a; - 特点&#xff1a;GeForce系列是英伟达主打的消费级GPU产品线&#xff0c;注重提供高性能的图形处理能力和游戏特性。它们…

2023年初中生古诗文大会复选最后6天备考策略和更新的在线模拟题

今天是2023年11月26日&#xff0c;星期日&#xff0c;距离2023年第八届上海市中学生古诗文大会复选&#xff08;复赛&#xff09;还有六天&#xff08;2023年12月2日上午举办&#xff09;&#xff0c;相信各位晋级的小学霸们正在繁忙的学业之余抓紧备考。 为了帮助孩子们更有效…

thinkphp最新开发的物业管理系统 缴费管理、停车管理、收费管理、值班管理

物业费&#xff0c;水电燃气费&#xff0c;电梯费&#xff0c;租金&#xff0c;临时收费等多种收费规则完全自定义&#xff0c;账单自动生成&#xff0c;无需人工计算 实时数据互通&#xff1a;一键报事报修&#xff0c;购买车辆月卡&#xff0c;管理家人信息&#xff0c;参加物…

idea spring initializr创建项目报错

闲来无事就想搞个项目练练手&#xff0c;没想到直接给我卡在项目创建上了&#xff0c;一个个问题最终迎刃而解。 1.上来就给我报了个maven的错 未解析的插件: ‘org.apache.maven.plugins:maven-resources-plugin:3.3.1’ 不慌&#xff0c;应该是maven的路径有问题&#xff0c…

Redis缓存淘汰策略

Redis缓存淘汰策略 1、各种面试题 生产上你们的redis内存设置多少?如何配置、修改redis的内存大小如果内存满了你怎么办&#xff1f;redis清理内存的方式?定期删除和惰性删除了解过吗&#xff1f;redis缓存淘汰策略有哪些?分别是什么?你用哪个?redis的LRU了解过吗?请手…

AMESim与MATLAB联合仿真demo

本文是AMESim与MATLAB联合仿真的demo&#xff0c;记录一下如何进行联合仿真。 AMESim与MATLAB联合仿真可以大幅度提高工作效率。 author&#xff1a;xiao黄 缓慢而坚定的生长 csdn:https://blog.csdn.net/Python_Matlab?typeblog主页传送门 博主的联合仿真环境如下&#xff…

代码随想录二刷 | 哈希表 | 快乐数

代码随想录二刷 &#xff5c; 哈希表 &#xff5c; 快乐数 题目描述解题思路 & 代码实现 题目描述 202.快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 …

代码随想录算法训练营 ---第四十三天

前言&#xff1a; 今天同样是01背包问题&#xff0c;今天详细学习了背包问题在各种场景下的应用。今天一道也没做出来&#xff0c;有点废。好难啊&#xff01;就是思路不太清晰&#xff0c;不知道如何去做&#xff0c;看了题解后感觉原来如此&#xff0c;但是想不出来。今天做…