前言部分

最近公司项目在做一个录音功能,主要就是实现一个简单的录音机的模块,模块中主要需要几点:

  1. 支持暂停录音
  2. 支持录制MP3格式音频
  3. 定制录制的进度条

如上需求我们具体分如何开始着手分析需要解决的问题,

  1. 如何支持暂停?android本身支持暂停的api是在新版本上才加入的(api24),系统的api不能满足我们的需求,所以要走其他的道路,通过拼接多个音频文件来完成暂停功能。

    这里简单了解一下android的支持的音频格式aac,amr。每个格式都有固定的文件格式。如:arm只有文件的前6个字节是文件头,我们只需要去除这个文件头拼接就可以了。

  2. 如上android支持的格式都不很友好,不能满足后台的需求,后台需要我们录制MP3格式的音频文件。我是通过大家熟悉lameMP3转码库实现,这里lame需要自己编译,网上例子比较多。我们录制完成的MP3文件,在通过对文件完成拼接同样实现暂停效果。
  3. 一个定制的环形进度条,涉及到简单自定义view的知识,不多介绍。
    Git地址
    效果图如下:

内容部分

录制音频文件我们可以通过两种方式来实现,分别是MediaRecorder和AudioRecord,这两种区别主要还是封装的程度不一样。MediaRecorder返回转码后的文件,AudioRecord能够拿到原始的PCM数据,这里你可以做很多的声音特效(变音)。网上文章比较多,请自行查看哈。

接下来我们要做的事情:使用AudioRecord进行录制,把原始的pcm文件通过lame的库进行转码,然后在把多个MP3文件链接起来,我们的需求就实现了。

开始第一部分内容,通过ndk对lame库编码生成so库。

使用了其他人的库,自己进行了编译。
库地址

  1. 首先我们需要把配置好ndk的相关内容,如安装,配置环境变量,这里不多介绍了,多数都是配置好的了。
  2. 修改里面的文件,这里需要注意把包名换成自己的包名,图片如下::
  3. 然后进入jni目录下,通过ndk-build来编译so库
  4. 会在jni的上级目录创建libs文件夹,生成我们的需要不同CPU架构的so库文件

这里在把生成的so库应用到项目的时候,出了一点小问题。记录如下:

我把生成的so库直接引入到项目中,发现不能打包到apk中,没有找到原因。这里可能是因为so的引入方式不对导致,也可能是因为我在java层有和so库相对应的方法有关。我的引入方式为,在main文件夹下(java同级目录),添加jniLibs文件夹,并把so库放到该目录下。

解决方案是单独创建了android的lib,然后把重新编译了so文件,放到该module下面。在应用中引入新建的android lib成功导入。

然后把生成的MP3文件进行合并,方法和合并arm文件类似,不过MP3文件的格式更复杂一些。

主要需要先把MP3文件进行分离,去掉头文件和尾文件。然后进行拼接就可以。这里使用了网上流传广泛的一个工具类实现(原地址我找不到了)。
代码如下:
传送门

结尾部分

android 音频相关内容比较多,有机会考虑在深入学习吧。

这里主要的知识点:

  • 通过android提供的api录制一段音频
  • 通过文件合成,完成api不提供的录音暂停功能
  • 使用音频转码库lame,将原始音频数据转化为MP3类型文件

更多相关文章

  1. Android登录状态记录
  2. 007:快图产品体验报告-Android【猎豹】
  3. Android之Windows下生成动态库so并打包到APK中
  4. Android(安卓)笔记 :Android(安卓)热修复 Tinker接入及源码浅析
  5. Andriod开发-存储篇之外部存储
  6. Android(安卓)ROM分析(1):刷机原理及方法
  7. Android适配器总结
  8. Android:使用webview上传文件(支持相册和拍照) .
  9. Android/读取指定类型的文件

随机推荐

  1. Android(安卓)面试题中高级
  2. 在 Android 设备上搭建 Web 服务器
  3. 关于Android的多种屏幕适配
  4. Android(安卓)NDK 知识系列(四)
  5. android内存溢出问题
  6. Android WebView、js交互方式原理总结
  7. android 多余文字显示省略号
  8. Android(安卓)FragmentTabHost 示例
  9. 工作不久的安卓开发者,他们是这样规划自己
  10. Android隐藏标题栏、状态栏、导航栏及全