前言

  MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频和摄像头采集图像.这个类是属于简单的音频录制类,录制音频简单容易但是对音频流的控制也比较弱,这篇博客将只介绍音频的录制

实现流程

  1. 获取权限
  2. 实例化MediaRecorder
  3. 配置MediaRecorder
  4. 开启录音
  5. 停止录音
  6. 暂停录音与恢复录音
  7. 销毁释放

获取权限

    <!--音频录制权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--读取和写入存储权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

注意!在Android 5.0后需要动态授权

实例化MediaRecorder

  private MediaRecorder mMediaRecorder;
private void initMediaRecorer(){
mMediaRecorder = new MediaRecorder();
}

没啥好说的,就是new一个MediaRecorder

配置MediaRecorder

private void configMediaRecorer(){
File demoAmrFile = new File(getExternalCacheDir(),"demo.amr");
if (demoAmrFile.exists()){
demoAmrFile.delete();
}
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//音频录入源
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);//录制音频的输出格式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//录制音频的编码格式 目前手机设备上可能就AMR_NB有用
mMediaRecorder.setOutputFile(demoAmrFile.getAbsolutePath());//音频输出路径和文件名称 注意!这个设置是有顺序要求的,必需是上面编码格式设置完成后才能,写到前面会报错
mMediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
//异常监听
mMediaRecorder.stop();//暂停
mMediaRecorder.release();//释放资源
mMediaRecorder = null;
}
});
mMediaRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {//信息回调
@Override
public void onInfo(MediaRecorder mr, int what, int extra) { }
}); }

注意!每一次录制音频前都需要配置一次.假设你录制暂停后,想重新录制新音频也需要重新执行一次这个方法,重新配置MediaRecorder!

再次注意! 配置参数是有顺序要求的的,没有按照顺序配置会报错,一般顺序是 > 配置音频源 > 配置音频输出格式 和 编码格式 > 配置其他参数(例如:文件大小限制/录制时间限制/音频比特率)> 配置文件保存路径  >  配置各种监听.

开启录音

  private void startRecorer(){
if (mMediaRecorder != null){
try {
mMediaRecorder.prepare();//准备
mMediaRecorder.start();//开启
} catch (IOException e) {
e.printStackTrace();
}
}
}

注意!点击后,开始录制之前先配置一次

 mBtnStatr.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
configMediaRecorer();
startRecorer(); }
});

暂停录音

private void stopRecorer(){
if (mMediaRecorder != null){
mMediaRecorder.stop();//暂停
mMediaRecorder.reset();//重启到空闲状态 此方法调用后需要重新配置参数
}
}

暂停录音与恢复录音

暂停录制,注意这里是pause()方法,不是stop()

private void pauseRecorder(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mMediaRecorder.pause();//暂停
}
}

恢复录制

private void resumeRecorder(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mMediaRecorder.resume();//恢复
}
}

销毁释放

private void destroy(){
if (mMediaRecorder != null){
mMediaRecorder.stop();
mMediaRecorder.release();//调用这个方法前必需先调用stop()方法
mMediaRecorder = null;
}
}

介绍有关音频录制的API

关于开始/停止/暂停/恢复/重置/释放的方法我就不在这里说明了,上面的流程代码里有写注释.也说了它们的关键点.另外录制视频的相关API也不在这里介绍

setAudioSource(int audio_source)

配置音频录入源,一般只需要选择MediaRecorder.AudioSource.MIC即可

setOutputFormat(int output_format)

设置录制音频的输出格式,在MediaRecorder.OutputFormat里有以下这些格式可以选择

  • DEFAULT:默认  在不更新对应值的情况下,不要更改这些值
  • THREE_GPP:3GP格式
  • MPEG_4:MP4格式
  • RAW_AMR:录制原始文件,这只支持音频录制,同时要求音频编码为AMR_NB
  • AMR_NB:   常用与通话文件语音格式 语音带宽范围:300-3400Hz,8KHz采样
  • AMR_WB:   常用与通话文件语音格式  语音带宽范围: 50-7000Hz,16KHz采样
  • AAC_ADIF:  Audio Data Interchange Format音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。
  • AAC_ADTS:  Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。这种格式可以用于广播电视。
  • OUTPUT_FORMAT_RTP_AVP: 未知
  • MPEG_2_TS:MPEG2-TS(Transport Stream“传输流”;又称TS、TP、MPEG-TS 或 M2T)是用于音效、图像与数据的通信协定,最早应用于DVD的实时传送节目。
  • WEBM:  WebM由Google提出,是一个开放、免费的媒体文件格式。WebM 影片格式其实是以 Matroska(即 MKV)容器格式为基础开发的新容器格式,里面包括了VP8影片轨和 Ogg Vorbis 音轨,其中Google将其拥有的VP8视频编码技术以类似BSD授权开源,Ogg Vorbis 本来就是开放格式。 WebM标准的网络视频更加偏向于开源并且是基于HTML5标准的,WebM 项目旨在为对每个人都开放的网络开发高质量、开放的视频格式,其重点是解决视频服务这一核心的网络用户体验。Google 说 WebM 的格式相当有效率,应该可以在 netbook、tablet、手持式装置等上面顺畅地使用

setAudioEncoder(int audio_encoder)

设置录制音频的编码格式  目前手机设备上可能就MediaRecorder.AudioEncoder.AMR_NB有用,其他都会报错

setOutputFile(String path)

设置输出音频文件的路径加文件名称,另外有一个setOutputFile(File file)方法,这个方法需要26API

setAudioEncodingBitRate(int bitRate)

设置音频的比特率, 比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,每秒传送数据就越多,音频也就越清晰

setMaxFileSize(long max_filesize_bytes)

设置录音文件的最大存储大小 ,单位是byte

setMaxDuration(int max_duration_ms)

设置录音文件的最大录制时间,单位是毫秒

setOnErrorListener(OnErrorListener l)

设置监听异常报错

setAudioChannels(int numChannels)

设置音频声道,官方注解里也说了这个方法的值一般是1或者2,分别代表单声道与双声道.

setOnInfoListener(OnInfoListener listener)

设置监听录制信息

Android 开发 MediaRecorder音频录制的更多相关文章

  1. Android 开发 MediaRecorder视频录制入门

    前言 MediaRecorder是Android SDK提供用于录制音视频,关于音频的录制在我另一篇博客里已经介绍.传送门: https://www.cnblogs.com/guanxinjing/p ...

  2. Android 开发 AudioRecord音频录制

    前言 Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风录入的音频数据进行编码压 ...

  3. Android 开发 MediaRecorder使用Camera1配合录制视频

    前言 MediaRecorder可以不依靠Camera API 实现视频的录制,但是如果需要切换摄像头/设置对焦/选择分辨率等等就需要Camera来参与配合录制视频.这篇博客将介绍使用Camera1来 ...

  4. Android开发 MediaRecorder使用Camera2配合录制视频(暂时有异常抛出,无法使用)

    前言 这个博客本来是用来详细介绍MediaRecorder与Camera2,但是出乎预料之外,在获取mMediaRecorder.getSurface();的时候无论如何都是报错的,报错为Surfac ...

  5. Android开发笔记——视频录制播放常见问题

    本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程 以微信为例,其录制触发为按下(住) ...

  6. android开发,静音录制视频,在一般清晰度的前提下保证文件大小越小越好

    public void startRecord() { mediarecorder = new MediaRecorder();// 创建mediarecorder对象 mCamera = getCa ...

  7. Android多媒体录制--MediaRecorder视频录制

    Android使用MediaRecorder类进行视频的录制. 需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错 步骤为: 1.设置视频源, ...

  8. Android使用的开发MediaRecorder录制视频

    MediaRecorder除了使用录制音频.还可用于录制视频.关于MediaRecorder的具体解释大家能够參考<Android开发之MediaRecorder类具体解释>.使用Medi ...

  9. Android使用的开发MediaRecorder录制声音

    至 Android 录制声音的应用,Android提供 MediaRecorder 类别.大约MediaRecorder可以参考一个特定的解释<Android开发之MediaRecorder类具 ...

随机推荐

  1. 李宏毅机器学习课程---4、Gradient Descent (如何优化 )

    李宏毅机器学习课程---4.Gradient Descent (如何优化) 一.总结 一句话总结: 调整learning rates:Tuning your learning rates 随机Grad ...

  2. 2019 牛客多校第六场 B Shorten IPv6 Address

    题目链接:https://ac.nowcoder.com/acm/contest/886/B 题目大意 给定一个 128 位的二进制 ip 地址,让你以 16 位一组,每组转成 16 进制,用冒号连接 ...

  3. Codeforces 1154B Make Them Equal

    题目链接:http://codeforces.com/problemset/problem/1154/B 题意:给定数组,可以给任意的的元素加上D 或者 减去D,如果能 使数组元素都相等,输出最小的D ...

  4. 54Mbps、150Mbps、433Mbps 你知道这三个Wi-Fi速率怎么算的吗?

           802.11g能够提供54Mbps的最大速率, 802.11n和802.11ac单流分别能够提供150Mbps和433Mbps的最大速率,这些数字是怎么算的呢?(看红字,更容易理解哟) ...

  5. HtmlCleanner结合xpath用法(转载)

    HtmlCleaner cleaner = new HtmlCleaner(); TagNode node = cleaner.clean(new URL("http://finance.s ...

  6. C++之赋值、比较、逻辑运算符

    赋值运算符 **作用:**用于将表达式的值赋给变量 赋值运算符包括以下几个符号: int main() { //赋值运算符 // = ; a = ; cout << "a = & ...

  7. QT5+Pylon

    VS+QT+Pylon:配置一下包含文件和libs,具体参考pylon说明文档. Windows下  Qtcreator+Pylon:建议把include和libs文件夹拷贝至工作目录,然后修改.pr ...

  8. gradle 随记

    gradle项目下添加jar包 compile fileTree(dir: './src/main/resources/lib', include: '*.jar') 将jar包放到这个目录下./sr ...

  9. mysql 的特殊函数

    1. FORMAT() 函数 函数用于对字段的显示进行格式化 语法: SELECT FORMAT(column_name,format) FROM table_name column_name  必需 ...

  10. Java基本语法.part02

    变量 变量的概念: 内存中的一个存储区域 该区域有自己的名称(变量名)和类型(数据类型) Java中每个变量必须先声明,后使用 该区域的数据可以在同一类型范围内不断变化 使用变量注意: 变量的作用域: ...