Android实现录音功能实现实例(MediaRecorder) - 腾讯云开发者社区-腾讯云

本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下:

Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord,各有优劣。

1、MediaRecorder

已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp

优点:大部分已经集成,直接调用相关接口即可,代码量小

缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件

2、AudioRecord

主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音)

优点:语音的实时处理,可以用代码实现各种音频的封装

缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩

先说 MediaRecorder : MediaRecorder因为大部分功能已经集成,所以使用起来相对比较简单。

下面是个小demo:

① 界面

界面比较简单,由于MediaRecorder 并不能实现暂停、继续录音的功能

<?xml version="1.0" encoding="utf-8"?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" <Buttonandroid:id="@+id/btn_start"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="开始" / <Buttonandroid:id="@+id/btn_stop"android:layout_width="match_parent"android:layout_height="wrap_content"android:enabled="false"android:text="停止" / <TextViewandroid:id="@+id/text_time"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="00:00:00"android:padding="5dp"android:layout_marginTop="10dp"/ </LinearLayout 

复制

② 相关录音功能

开始录音

  public void startRecord() {// 开始录音/* ①Initial:实例化MediaRecorder对象 */if (mMediaRecorder == null)mMediaRecorder = new MediaRecorder();try {/* ②setAudioSource/setVedioSource */mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风/** ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)*/mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {FileUtils.makeFolders(audioSaveDir);}filePath = audioSaveDir + fileName;/* ③准备 */mMediaRecorder.setOutputFile(filePath);mMediaRecorder.prepare();/* ④开始 */mMediaRecorder.start();} catch (IllegalStateException e) {LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());} catch (IOException e) {LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());}}

复制

音频编码可以根据自己实际需要自己设定,文件名防止重复,使用了日期_时分秒的结构,audioSaveDir 是文件存储目录,可自行设定。

停止录音

  public void stopRecord() {try {mMediaRecorder.stop();mMediaRecorder.release();mMediaRecorder = null;filePath = "";} catch (RuntimeException e) {LogUtil.e(e.toString());mMediaRecorder.reset();mMediaRecorder.release();mMediaRecorder = null;File file = new File(filePath);if (file.exists())file.delete();filePath = "";}}

复制

时长记录

  // 记录录音时长private void countTime() {while (isRecording) {LogUtil.d("正在录音");timeCount++;Message msg = Message.obtain();msg.what = TIME_COUNT;msg.obj = timeCount;myHandler.sendMessage(msg);try {timeThread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}LogUtil.d("结束录音");timeCount = 0;Message msg = Message.obtain();msg.what = TIME_COUNT;msg.obj = timeCount;myHandler.sendMessage(msg);}

将录音时长格式化

  // 格式化 录音时长为 时:分:秒public static String FormatMiss(int miss) {String hh = miss / 3600   9 ? miss / 3600 + "" : "0" + miss / 3600;String mm = (miss % 3600) / 60   9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60;String ss = (miss % 3600) % 60   9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60;return hh + ":" + mm + ":" + ss;}

Activity全部代码

import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.zzx.hellokotlin.R;
import com.zzx.hellokotlin.utils.FileUtils;
import com.zzx.hellokotlin.utils.LogUtil;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;
public class Record2Activity extends AppCompatActivity {
// 录音界面相关
Button btnStart;
Button btnStop;
TextView textTime;
// 录音功能相关
MediaRecorder mMediaRecorder; // MediaRecorder 实例
boolean isRecording; // 录音状态
String fileName; // 录音文件的名称
String filePath; // 录音文件存储路径
Thread timeThread; // 记录录音时长的线程
int timeCount; // 录音时长 计数
final int TIME_COUNT = 0x101;
// 录音文件存放目录
final String audioSaveDir = Environment.getExternalStorageDirectory().getAbsolutePath()+"/audiodemo/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record2);
btnStart = (Button) findViewById(R.id.btn_start);
btnStop = (Button) findViewById(R.id.btn_stop);
textTime = (TextView) findViewById(R.id.text_time);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 开始录音
btnStart.setEnabled(false);
btnStop.setEnabled(true);
startRecord();
isRecording = true;
// 初始化录音时长记录
timeThread = new Thread(new Runnable() {
@Override
public void run() {
countTime();
}
});
timeThread.start();
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 停止录音
btnStart.setEnabled(true);
btnStop.setEnabled(false);
stopRecord();
isRecording = false;
}
});
}
// 记录录音时长
private void countTime() {
while (isRecording) {
LogUtil.d("正在录音");
timeCount++;
Message msg = Message.obtain();
msg.what = TIME_COUNT;
msg.obj = timeCount;
myHandler.sendMessage(msg);
try {
timeThread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
LogUtil.d("结束录音");
timeCount = 0;
Message msg = Message.obtain();
msg.what = TIME_COUNT;
msg.obj = timeCount;
myHandler.sendMessage(msg);
}
/**
* 开始录音 使用amr格式
* 录音文件
* @return
*/
public void startRecord() {
// 开始录音
/* ①Initial:实例化MediaRecorder对象 */
if (mMediaRecorder == null)
mMediaRecorder = new MediaRecorder();
try {
/* ②setAudioSource/setVedioSource */
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
/*
* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
*/
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";
if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {
FileUtils.makeFolders(audioSaveDir);
}
filePath = audioSaveDir + fileName;
/* ③准备 */
mMediaRecorder.setOutputFile(filePath);
mMediaRecorder.prepare();
/* ④开始 */
mMediaRecorder.start();
} catch (IllegalStateException e) {
LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());
} catch (IOException e) {
LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());
}
}
/**
* 停止录音
*/
public void stopRecord() {
//有一些网友反应在5.0以上在调用stop的时候会报错,翻阅了一下谷歌文档发现上面确实写的有可能会报错的情况,捕获异常清理一下就行了,感谢大家反馈!
try {
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
filePath = "";
} catch (RuntimeException e) {
LogUtil.e(e.toString());
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
File file = new File(filePath);
if (file.exists())
file.delete();
filePath = "";
}
}
// 格式化 录音时长为 时:分:秒
public static String FormatMiss(int miss) {
String hh = miss / 3600   9 ? miss / 3600 + "" : "0" + miss / 3600;
String mm = (miss % 3600) / 60   9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60;
String ss = (miss % 3600) % 60   9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60;
return hh + ":" + mm + ":" + ss;
}
Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TIME_COUNT:
int count = (int) msg.obj;
LogUtil.d("count == " + count);
textTime.setText(FormatMiss(count));
break;
}
}
};
}

总结:MediaRecorder 实现录音还是比较简单的,只是不能暂停。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Android实现录音功能实现实例(MediaRecorder)相关推荐

  1. android java 录音放大_Android实现录音功能实现实例(MediaRecorder)

    本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下: Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord, ...

  2. android实现录音功能demo

    android实现录音功能demo 主要功能实现 视频演示 录音相关代码 下载链接 主要功能实现 主要实现录音功能,录音,停止录音,保存录音,然后可以查看录音列表,还用sqlite数据库实现了用户的注 ...

  3. Android之录音功能

    Android之录音功能 1.需要权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE ...

  4. android+发邮件,Android发送邮件的方法实例详解

    Android发送邮件的方法实例详解 时间:2021-05-20 本文实例讲述了Android发送邮件的方法.分享给大家供大家参考,具体如下: 在android手机中实现发送邮件的功能也是不可缺少的. ...

  5. android 代码浏览,Webview实现android简单的浏览器实例代码

    WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面,下面通过本文给大家介绍Webv ...

  6. Android Gesture 手势识别使用实例 - Android - mobile - ITeye论坛

    Android Gesture 手势识别使用实例 - Android - mobile - ITeye论坛 主题:Android Gesture 手势识别使用实例 精华帖 (0) :: 良好帖 (0) ...

  7. Android Input子系统-含实例源码

    Android Input子系统-含实例源码 1 Input子系统作用 Android很多外设都是用到输入输出设备,比如touchscreen,键盘,音量键等,输入 设备对应Android 框架是An ...

  8. Android平台RTMP多实例推送的几种情况探讨

    好多开发者提到,如何实现Android平台,多实例推送,多实例推送,有几种理解: 多路编码,多个实例分别推送到不同的RTMP URL(如Android采集板卡同时接2路出去): 同一路编码,多个实例分 ...

  9. android 刷新标题栏,Android 自定义标题栏的实例详解

    Android 自定义标题栏的实例详解 开发 Android APP 经常会用到自定义标题栏,而有多级页面的情况下还需要给自定义标题栏传递数据. 本文要点: 自定义标题填充不完整 自定义标题栏返回按钮 ...

最新文章

  1. linux监控(陆续补充)
  2. vue+element 后台管理系统(三)树形图
  3. Python 的字符串内建函数
  4. 如何打造千万级Feed流系统?阿里数据库技术解读
  5. darknet activate_array
  6. extra增强延迟加载
  7. JAVA延迟执行(thread方式和timer方式)
  8. 骚操作!使用家里的服务器也能像用云服务器一样方便!
  9. 【SICP练习】150 练习4.6
  10. SpringBoot请求参数传递与接收
  11. java基础-(二)-第一个java程序
  12. word怎么加入html,Word中怎么放入html
  13. 6410 UBOOT 支持SD/SDHC卡启动 FAT32文件系统 yaffs2烧录 图片显示烧录状态
  14. 计算机网络英语形容词,英语常用形容词有哪些
  15. 开发管理---项目的范围、时间与成本
  16. czy的后宫——矩阵快速幂优化DP
  17. Web API-添加Swagger,SQL Server,记录并导出到Excel
  18. 在html页面中展示pdf文件,实现在线阅读
  19. 用C语言去判断一个字符串是否为回文字符串(简单明了)
  20. 【漏洞复现】RTF URL Moniker 的逻辑漏洞 | OLE2Link 漏洞(CVE-2017-0199)

热门文章

  1. 营收净利同比上涨,甲骨文回“血”了吗??
  2. 易语言 json取成员数 根节点就是数组
  3. 十月百度,阿里巴巴,迅雷搜狗最新面试七十题(第201-270题)
  4. @Cacheable 设置缓存过期时间
  5. Unity Shader-遮挡处理(X-Ray,遮挡描边,遮挡半透,遮挡溶解)
  6. 洛谷P3667 [USACO17OPEN]Bovine Genomics G 动态规划
  7. PMP考试时间是什么时候?
  8. PS安装插件提示无法加载扩展未正确签署解决方式(适用于mac/win)
  9. 南邮 OJ 2026 Keroro侵略地球
  10. 【Dest0g3 520迎新赛】密码学部分Wp及LCG(线性同余生成器)攻击方法